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

时间:2012-06-12 04:20:45

标签: python zip

我想写一个python脚本来处理一些日志文件。该应用程序每周产生大约一千兆字节的日志,并在本周末将这些日志分解为每个约50兆字节。

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

我不需要写作。注意,我在这里处理目录(和压缩目录),而不仅仅是单个文件,所以我需要能够同时移动它们。

2 个答案:

答案 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])

我忽略了一些实现细节,并且还要正确打开/关闭文件。但是,希望这能给你一个大致的想法。