我想写一个python脚本来处理一些日志文件。该应用程序每周产生大约一千兆字节的日志,并在本周末将这些日志分解为每个约50兆字节。
我不想分开处理zip文件和非压缩日志文件的代码,即我不想在整个代码中使用if (zip) then (blah1) else (blah2)
,理想情况下这样的检查应该只发生一次,并且其余代码应该是相同的。是否有任何方法/库统一zip /普通文件,因此可以使用相同的代码来读取它们。
我不需要写作。注意,我在这里处理目录(和压缩目录),而不仅仅是单个文件,所以我需要能够同时移动它们。
答案 0 :(得分:4)
我的基本方法是抽象zip文件和目录,以便它们具有类似的接口。在这里,我选择将zip文件视为“规范”,并简单地为目录实现了zipfile
的{{1}}和namelist()
方法。 (这与Mark Hildreth的回答类似,但我并没有设计一个全新的API。)当然,如果需要,你可以实现更多。
工厂函数open()
会返回opencontainer()
实例或ZipFile
实例,具体取决于您提供的内容。 (您也可以在Directory
上使用__new__()
方法执行此操作。)
然后,您可以使用容器的Directory
方法迭代namelist()
并打开容器内的文件。此时,您有一个open()
对象或来自zip文件的类文件对象,并且这些对象的API在设计上已经相似。
file
这是一个非常粗略的解决方案草图,可能需要一些加强的错误处理和资源管理(上下文管理器可能有意义确保文件关闭)。
答案 1 :(得分:2)
我不确定任何这样做的库,但写起来并不难。基本上,你按照你的说法做:在开始时检查一次,然后根据你找到的文件类型做出反应。 “strategy pattern”是编程中常见的模式,看起来像这样...
class ZipFileAccessStrategy(object):
def __init__(self, filename):
...open the zipfile...
def get_file(self, filename):
...get a file from the archive....
def get_files(self, directory):
...get a list of all files in a directory in the zip file...
class DirectoryAccessStrategy(object):
def __init__(self, directory):
...store the name of the directory...
def get_file(self, filename):
...get a file relative to this directory....
def get_files(self, directory):
...get a list of all files in a specific path relative to the directory...
filename = '...'
if is_zipfile(filename):
strategy = ZipFileAccessStrategy(filename)
else:
strategy = DirectoryAccessStrategy(filename)
# Now we can access whether Zip File or Directory using a common interface
file_list = strategy.get_files('/')
f = strategy.get_file(file_list[0])
我忽略了一些实现细节,并且还要正确打开/关闭文件。但是,希望这能给你一个大致的想法。