2016-06-20 5 views
1

내 목표는 특정 하위- 디렉토리에 포함 된 모든 파일을 zip- 아카이브 안에 나열하는 것입니다.os.listdir zip 디렉토리의 아날로그

os.listdir(target_dir)FileNotFoundError을 발생시키고 zfile.namelist()은 모든 디렉토리의 모든 파일을 나열합니다.

아이디어가 있으십니까?

답변

1

는 다음과 같은 시도 :

files = list(filter(lambda f: f.startswith("subdir"), zfile.namelist())) 

print(files) 

설명 : filter 파일 이름은 "하위 디렉터리"로 시작 여부를 확인하는 lambdazfile.namelist()에서 제공하는 목록을 필터링합니다.

함수는 목록을 반환하지 않고 필터 객체 (생성자)를 반환하므로 목록으로 변환해야합니다.

또한 같은 작업을 수행하지만, 지능형리스트를 사용하여 다음 줄을 사용할 수 있습니다

files = [f for f in zfile.namelist() if f.startswith("subdir")] 

편집 : advance512에 의해 지적 : "이 솔루션의 문제는 또한 하위 디렉토리에있는 파일을 반환 할 것입니다 검사중인 하위 디렉토리에 있습니다. ":

files = [f for f in zfile.namelist() if f.startswith("subdir") and f.count("/") == 1] 

하위 하위 디렉토리의 파일을 반환하지 않습니다.

+1

이 솔루션의 문제점은 검사중인 하위 디렉토리의 하위 디렉토리에도 파일을 반환한다는 것입니다. 이것이 당신이 찾고있는 것이라면, 그것은 좋은 해결책입니다 (나는 일반적으로 lambdas와 comprehensions도 선호하지만, 당신은 함수를 요구하고 있습니다). – advance512

+0

@ advance512 고맙습니다. 나는 그것을 고려하지 않았습니다. 나는 나의 대답을 업데이트했다. –

+2

또는 regex 표현식을 사용하여 특정 하위 디렉토리의 모든 파일 (≠ 하위 디렉토리)을 가져올 수 있습니다. re.compile ("^ ("+ re. escape ("subdir") + r "\/[^ \ /] *?) $"). match (f)]'. 하지만이 경우에는're' 모듈을 가져와 사용해야합니다. 그 때문에 나는 @SimonKirsten 원문 답을 더 선호한다. –

2

제공된 zip_listdir 기능을 사용할 수 있습니다.이 기능은 조금 더 빠르지 만 항상 유닉스 클론에서 작동해야합니다.

class MockZipFile(object): 
    fake_file_names = [ 
     "string.pyc", # Top level name 
     "test/__init__.pyc", # Package directory 
     "test/test_support.pyc", # Module test.test_support 
     "test/bogus/__init__.pyc", # Subpackage directory 
     "test/bogus/myfile.pyc" # Submodule test.bogus.myfile 
    ] 

    def namelist(self): 
     return self.fake_file_names 


def zip_listdir(zip_file, target_dir): 

    file_names = zip_file.namelist() 

    if not target_dir.endswith("/"): 
     target_dir += "/" 

    if target_dir == "/": 
     target_dir = "" 

    result = [ file_name 
       for file_name in file_names 
       if file_name.startswith(target_dir) and 
        not "/" in file_name[len(target_dir):] 
       ] 

    return result 

mockZipfile = MockZipFile() 
print zip_listdir(zip_file=mockZipfile, target_dir="test") 
print zip_listdir(zip_file=mockZipfile, target_dir="test/bogus") 
print zip_listdir(zip_file=mockZipfile, target_dir="test/") 
print zip_listdir(zip_file=mockZipfile, target_dir="/") 
print zip_listdir(zip_file=mockZipfile, target_dir="") 
print zip_listdir(zip_file=mockZipfile, target_dir="/asd") 

내가 MockZipFile 클래스를 생성주의하고, zip_listdir 함수에 대한 입력으로 사용하고 있지만, 적절한 zipfile 목적은 정확히 같은 작업을해야 바랍니다.

관련 문제