gpt4 book ai didi

Python:透明地处理压缩文件和普通文件

转载 作者:太空宇宙 更新时间:2023-11-03 13:50:04 25 4
gpt4 key购买 nike

我想写一个 python 脚本来处理一些日志文件。该应用程序每周生成大约 1 GB 的日志,并在周末将这些日志压缩到每个大约 50 兆字节。

我不想将处理 zip 文件和非压缩日志文件的代码分开,即我不想 if (zip) then (blah1) else (blah2) all在整个代码中,理想情况下这样的检查应该只发生一次,并且代码的其余部分应该是相同的。有没有什么方法/库可以统一 zip/普通文件,以便可以使用相同的代码来读取它们。

我不需要写。请注意,我在这里处理的是目录(和压缩目录),而不仅仅是单个文件,因此我需要能够同时移动这两个文件。

最佳答案

我的基本方法是抽象一个 zip 文件和一个目录,使它们具有相似的界面。在这里,我选择将 zip 文件视为“规范的”,并简单地实现了 zipfilenamelist()open() 方法目录。 (这类似于 Mark Hildreth 的回答,只是我没有设计一个全新的 API。)当然,如果需要,您可以实现更多。

工厂函数 opencontainer() 返回一个 ZipFile 实例或一个 Directory 实例,具体取决于您给它的内容。 (您也可以只使用 Directory 上的 __new__() 方法来执行此操作。)

然后您可以遍历 namelist() 并使用容器的 open() 方法打开容器内的文件。此时,您有一个 file 对象或一个来自 zip 文件的类文件对象,并且它们的 API 在设计上已经很相似。

import zipfile, os

class Directory(object):
def __init__(self, path):
self.path = path
def namelist(self):
return os.listdir(self.path)
def open(self, name):
return open(os.path.join(self.path, name))

def opencontainer(path):
if zipfile.is_zipfile(path):
return zipfile.ZipFile(path)
return Directory(path)

container = opencontainer(path)
for logname in container.namelist():
logtext = container.open(logname).read()

这是一个非常粗略的解决方案草图,可能需要一些增强的错误处理和资源管理(上下文管理器可能有助于确保文件关闭)。

关于Python:透明地处理压缩文件和普通文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10990483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com