私の基本的なアプローチは、zipファイルとディレクトリを抽象化して、それらが同様のインターフェイスを持つようにすることです。ここでは、zipファイルを「正規」と見なし、ディレクトリzipfile
のnamelist()
と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()
これはソリューションの非常に大まかなスケッチであり、おそらくいくつかの強化されたエラー処理とリソース管理が必要です(コンテキストマネージャーはファイルが閉じられることを確認するのに意味があるかもしれません)。