我的基本方法是抽象一个 zip 文件和一个目录,以便它们具有相似的接口。在这里,我选择考虑 zip 文件“规范”并简单地为目录实现zipfile
'snamelist()
和open()
方法。(这类似于 Mark Hildreth 的回答,只是我不是在设计一个全新的 API。)当然,如果需要,您可以实现更多。
工厂函数根据您给它的内容opencontainer()
返回一个ZipFile
实例或一个实例。Directory
(您也可以只使用一种__new__()
方法Directory
来执行此操作。)
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()
这是一个非常粗略的解决方案草图,可能需要一些增强的错误处理和资源管理(上下文管理器可能有助于确保文件关闭)。