내 기본 접근 방식은 zip 파일과 디렉토리를 추상화하여 유사한 인터페이스를 갖게하는 것입니다. 여기에서는 zip 파일을 "정식"으로 간주하고 단순히 zipfile
의 namelist()
및 open()
디렉토리 구현 방법을 구현했습니다. (이것은 Mark Hildreth의 답과 비슷하지만 완전히 새로운 API를 설계하지는 않습니다.) 물론 더 많은 기능을 구현할 수 있습니다.
공장 기능 opencontainer()
은 사용자가 부여한 내용에 따라 ZipFile
인스턴스 또는 Directory
인스턴스를 반환합니다. (당신은 또한 단지 이렇게 Directory
에 __new__()
방법을 사용할 수 있습니다.)
그런 다음 컨테이너의 open()
방법을 사용하여 컨테이너 내부에 이상 namelist()
및 열려있는 파일을 반복 할 수 있습니다. 이 시점에서 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()
는이 솔루션의 매우 거친 스케치, 그리고 아마이 강화 된 오류 처리 및 자원 관리 (문맥 관리자가 파일이 폐쇄 얻을 수 있는지 확인하기 위해 적합 할 수 있습니다)이 필요합니다.