내 목표는 특정 하위- 디렉토리에 포함 된 모든 파일을 zip- 아카이브 안에 나열하는 것입니다.os.listdir zip 디렉토리의 아날로그
os.listdir(target_dir)
은 FileNotFoundError
을 발생시키고 zfile.namelist()
은 모든 디렉토리의 모든 파일을 나열합니다.
아이디어가 있으십니까?
내 목표는 특정 하위- 디렉토리에 포함 된 모든 파일을 zip- 아카이브 안에 나열하는 것입니다.os.listdir zip 디렉토리의 아날로그
os.listdir(target_dir)
은 FileNotFoundError
을 발생시키고 zfile.namelist()
은 모든 디렉토리의 모든 파일을 나열합니다.
아이디어가 있으십니까?
는 다음과 같은 시도 :
files = list(filter(lambda f: f.startswith("subdir"), zfile.namelist()))
print(files)
설명 : filter
파일 이름은 "하위 디렉터리"로 시작 여부를 확인하는 lambda
에 zfile.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]
하위 하위 디렉토리의 파일을 반환하지 않습니다.
제공된 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 목적은 정확히 같은 작업을해야 바랍니다.
이 솔루션의 문제점은 검사중인 하위 디렉토리의 하위 디렉토리에도 파일을 반환한다는 것입니다. 이것이 당신이 찾고있는 것이라면, 그것은 좋은 해결책입니다 (나는 일반적으로 lambdas와 comprehensions도 선호하지만, 당신은 함수를 요구하고 있습니다). – advance512
@ advance512 고맙습니다. 나는 그것을 고려하지 않았습니다. 나는 나의 대답을 업데이트했다. –
또는 regex 표현식을 사용하여 특정 하위 디렉토리의 모든 파일 (≠ 하위 디렉토리)을 가져올 수 있습니다. re.compile ("^ ("+ re. escape ("subdir") + r "\/[^ \ /] *?) $"). match (f)]'. 하지만이 경우에는're' 모듈을 가져와 사용해야합니다. 그 때문에 나는 @SimonKirsten 원문 답을 더 선호한다. –