2012-06-12 3 views
2

일부 로그 파일을 처리하기 위해 python 스크립트를 작성하고 싶습니다. 응용 프로그램은 일주일에 약 1 기가 바이트의 로그를 생성하고, 주말에는이 로그를 약 50 메가 바이트까지 압축합니다.Python : 압축 파일과 일반 파일을 투명하게 처리하기

zip 파일과 압축되지 않은 로그 파일을 처리하는 코드를 분리하고 싶지 않습니다. 즉, 코드 전체에 if (zip) then (blah1) else (blah2)을 사용하지 않으려는 경우 이상적으로 이러한 확인은 한 번만 수행하면됩니다. 코드는 동일해야합니다. zip/normal 파일을 통합하는 방법/라이브러리가있어 동일한 코드를 사용하여 읽을 수 있습니다.

글을 쓸 필요가 없습니다. 참고, 여기서는 개별 파일뿐만 아니라 디렉토리 (및 압축 된 디렉토리)를 다루므로 둘 다 동일한 방향으로 이동할 수 있어야합니다.

답변

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

... 이런 식으로 뭔가를 볼 수 있었다 프로그래밍의 일반적인 패턴이다,뿐만 아니라 걱정할 파일의 적절한 개방/폐쇄가있다. 그러나 이것은 일반적인 아이디어를 제공합니다.

4

내 기본 접근 방식은 zip 파일과 디렉토리를 추상화하여 유사한 인터페이스를 갖게하는 것입니다. 여기에서는 zip 파일을 "정식"으로 간주하고 단순히 zipfilenamelist()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() 

는이 솔루션의 매우 거친 스케치, 그리고 아마이 강화 된 오류 처리 및 자원 관리 (문맥 관리자가 파일이 폐쇄 얻을 수 있는지 확인하기 위해 적합 할 수 있습니다)이 필요합니다.

관련 문제