2012-07-23 4 views
5

처음에는 os.path.isdir을 사용하려고 생각했지만이 파일은 zip 파일로는 작동하지 않습니다. zip 파일을 들여다보고이 디렉토리가 있는지 확인하는 방법이 있습니까? 가능한 한 많이 unzip -l "[email protected]"을 사용하지 못하게하고 싶습니다. 그러나 이것이 유일한 해결책이라면 나는 선택의 여지가 없다고 생각합니다.디렉토리가 파이썬이있는 zip 파일에 있는지 확인하십시오.

답변

6

끝에 "/"로 파일 이름을 확인하십시오. 이 아카이브에는 디렉토리를 명시 적으로 포함하지 않는 것이 가능하기 때문에

import zipfile 

def isdir(z, name): 
    return any(x.startswith("%s/" % name.rstrip("/")) for x in z.namelist()) 

f = zipfile.ZipFile("sample.zip", "r") 
print isdir(f, "a") 
print isdir(f, "a/b") 
print isdir(f, "a/X") 

는이 라인

any(x.startswith("%s/" % name.rstrip("/")) for x in z.namelist()) 

를 사용; 디렉토리 이름이있는 경로.

실행 결과 : 당신은 내장 된 라이브러리 ZipFile를 사용하여이 작업을 수행 할 수

$ mkdir -p a/b/c/d 
$ touch a/X 
$ zip -r sample.zip a 
adding: a/ (stored 0%) 
adding: a/X (stored 0%) 
adding: a/b/ (stored 0%) 
adding: a/b/c/ (stored 0%) 
adding: a/b/c/d/ (stored 0%) 

$ python z.py 
True 
True 
False 
+0

고마워요! 당신이 제공 한 샘플로 잘 작동합니다.하지만 docx 파일에 대해 이렇게하려고합니다. 기본적으로 zip 파일에 "단어"디렉터리가 포함되어 있는지 확인하고 있지만 잘못된 응답을 제공하고 있습니다. : –

+0

그냥'docx'에있는 파일 목록을 출력하고 그것으로 이상한 것을 보자 :'print zipfile.ZipFile ("sample.docx", "r"). namelist()' –

+0

'word' 앞에 접두사가 있다고 가정합니다. 그것을 확인하십시오. –

6

ZipFile.namelist()으로 디렉토리를 확인할 수 있습니다.

import os, zipfile 
dir = "some/directory/" 

z = zipfile.ZipFile("myfile.zip") 
if dir in z.namelist(): 
    print "Found %s!" % dir 
+0

이것은 파일이 아닌 디렉토리에서 작동합니다. (적어도 나에게는 적합하지 않습니다.) –

+0

.zip 파일의'namelist()'를 출력하여 디렉토리의 형식이 올바른지 확인하십시오. – enderskill

+0

그래, 디렉토리가 있는지 확인했습니다. 거기에 .docx 파일을 위해 노력하고있어, 어쨌든 그렇게 중요하지 않아야한다. –

0

.

import zipfile 
z = zipfile.ZipFile("file.zip") 

if "DirName/" in [member.filename for member in z.infolist()]: 
    print("Directory exists in archive") 

Python32에서 테스트되고 작동합니다.

+0

어떤 이유로 든 docx 파일에서 작동하지 않습니다. : –

+0

zip 대신 docx 파일을 사용하려고합니까? 확장명을 .zip으로 바꾸고 다시 시도하면 정상적으로 작동합니다. – Lanaru

+0

압축이 잘 풀리지 만 모든 파일을 인쇄 할 수 있습니다. 디렉토리 "word"는 namelist()에 없으며 word/webSettings.xml과 같은 개별 파일이 아니므로 일치하지 않습니다. –

관련 문제