2012-05-05 4 views
4

파이썬에서 이상한 오류가 발생합니다. zip 모듈을 사용하여 암호로 보호 된 파일의 압축을 풀려고하면 "oy"를 암호로 설정하려고 할 때 예외가 발생합니다. 다른 모든 것은 효과가있는 것처럼 보입니다. ZipFile 모듈의 버그?암호로 압축 해제 된 zip 파일이 실패합니다 - Python 버그?

import zipfile  
zip = zipfile.ZipFile("file.zip", "r") 
zip.setpassword("oy".encode('utf-8')) 
zip.extractall() #Above password "oy" generates the error here 
zip.close() 

입니다 예외가 내가 얻을 :

zlib.error: Error -3 while decompressing: invalid distance too far back 

편집 내가 지금 테스트 한 :

Traceback (most recent call last): 
    File "unzip.py", line 4, in <module> 
    zip.extractall() 
    File "C:\Program Files\Python32\lib\zipfile.py", line 1002, in extrac 
l 
    self.extract(zipinfo, path, pwd) 
    File "C:\Program Files\Python32\lib\zipfile.py", line 990, in extract 
    return self._extract_member(member, path, pwd) 
    File "C:\Program Files\Python32\lib\zipfile.py", line 1035, in _extra 
member 
    shutil.copyfileobj(source, target) 
    File "C:\Program Files\Python32\lib\shutil.py", line 65, in copyfileo 
    buf = fsrc.read(length) 
    File "C:\Program Files\Python32\lib\zipfile.py", line 581, in read 
    data = self.read1(n - len(buf)) 
    File "C:\Program Files\Python32\lib\zipfile.py", line 633, in read1 
    max(n - len_readbuffer, self.MIN_READ_SIZE) 
zlib.error: Error -3 while decompressing: invalid block type 

내가 인코딩으로 UTF-16를 사용하는 경우 나는이 오류 다음과 같은 것들을 가진 가상 리눅스 머신 :

  • 파이썬 버전 : 2.6.5
  • 나는 지금은 문제가 뭔가 다른 것 같다 zip -e file.zip hello.txt

와 암호로 보호 된 zip 파일을 만들었습니다. 이제 암호가 틀린 경우에도 zip 파일을 추출 할 수 있습니다!

try: 
    zip.setpassword("ks") # "ks" is wrong password but it still extracts the zip 
    zip.extractall() 
except RuntimeException: 
    print "wrong!" 

간혹 잘못된 비밀번호로 압축 파일을 추출 할 수 있습니다. 파일 (압축 파일 안쪽)을 압축 해제하지만 열려고하면 정보가 손상/해독 된 것 같습니다.

+3

참고로 'ZipFile'은 컨텍스트 관리자이므로 열기와 마찬가지로 [the with with statement] (http://docs.python.org/reference/compound_stmts.html#with)를 사용할 수 있습니다. 파일. 더 읽기 쉽고 예외가 발생하더라도 올바르게 닫히는 것을 처리합니다. –

+0

다른 인코딩을 사용해 보셨습니까? utf16? – User

+0

@ user1320237 : 예, 있습니다. 같은 문제. 하지만 다른 암호는 작동하지 않습니다. – Rox

답변

8

일반적으로 다음과 같은 예외가 암호에 문제가 있으면 :

RuntimeError: ('Bad password for file', <zipfile.ZipInfo object at 0xb76dec2c>) 

당신의 예외가 블록 타입에 대해 불평 때문에

, 당신의 .zip 아카이브가 손상되어 대부분의 아마, 당신은 그것을 풀고 시도 독립 실행 형 압축 풀기 유틸리티?

아니면 호환되지 않는 .zip 아카이브를 만드는 7zip과 같은 재미있는 것을 사용했을 수도 있습니다.


당신은 충분한 정보를 제공하지 않습니다 (OS 버전? 파이썬 버전? ZIP 아카이브 작성자와 내용은? 그 보관 또는 단일 아카이브에서 하나의 파일이 많은 파일은 그 파일이 같은 오류를주고 모든합니까?, 또는 그 중 일부는 압축을 풀 수 있습니까?), 빠른 Q & 섹션을 참조하십시오.이 섹션은 문제를 찾아 해결하는 데 도움이됩니다.

1x. 이것은 파이썬의 버그입니까?

a1. 가능성이 낮습니다.

질문 2.이 문제가 발생할 수있는 이유는 무엇입니까?

A2. 깨진 zip 파일, 호환되지 않는 zip 압축기 - 아무 것도 말하지 않으므로 정확한 원인을 가리키는 것이 어렵습니다.

3. 원인을 찾는 방법은 무엇입니까?

A3. 문제를 찾아 내고, 오류가있는 파일을 찾고 zip.testzip()을 사용하거나 다른 파일 압축 해제 유틸리티로 특정 파일의 압축을 풀고 결과를 공유하십시오. 문제가되는 파일에만 액세스 할 수 있으므로 자신이 뭔가를하려고하지 않는 한 아무도 도와 줄 수 없습니다.

4. 해결 방법?

A4. 할 수 없습니다. 다른 zip 추출기를 사용하면 ZipFile이 작동하지 않습니다.

+0

zip 파일의 비밀번호가 "hello"와 다른 경우 작동합니다. 그럼 내가 문제없이 위의 파이썬 코드로 압축을 풀 수 있습니다. 그래서 다른 것이되어야합니다. 어쩌면 버그일까요? – Rox

+0

암호로 ASCII 문자를 사용하는 한'encode ('utf-8') '과 같은 점이 없으므로 동일한 ASCII 문자를 돌려줍니다. BTW, 당신은 당신이 정성 들여 주길 바래요, 당신은 .zip 파일을 만드는데 어떤 소프트웨어를 사용합니까? – lenik

+0

파일을 만든 소프트웨어가 무엇인지 모르겠습니다. 내 작품에는 여러 개의 파일이 있으며 각 zip 파일의 모든 비밀번호 목록이 있으며이 파일들을 모두 추출하는 python 스크립트를 만들고 싶습니다. 하지만 위에서 말한 것처럼 ASCII 또는 UTF-16으로 인코딩 된 경우에도 일부 암호가 작동하지 않는 것 같습니다. – Rox

5

파일을 추출하기 전에 testzip() 메서드를 사용하여 파일의 무결성을 확인하십시오.

+0

"없음"을 반환합니다. 그렇다면 zip 파일이 손상되지 않았습니까? – Rox

+0

예. 파일이 손상된 경우 읽을 수없는 파일의 이름을 반환합니다. unzip이나 winzip과 같은 다른 압축 해제 프로그램으로 문제가있는 zip 파일의 압축을 풀 수 있습니까? 문제가 없으면 Python 버그를 의심하는 것이 합리적입니다. 버그 보고서를 제출하기 전에 최신 버전의 Python으로 업그레이드하십시오. –

+0

더 자세히 살펴보면 실제 오류는 (적어도 유닉스에서는) 시스템의 공유 libz 라이브러리를 사용하는 동적으로로드 된 zlib 모듈에서 발생합니다. 그래서 이것이 버그라면, 그것은 여러 장소에있을 수 있습니다. –

3

아마도 zipfile의 버그 일 수도 있고 Zip 구현의 버그 일 수도 있습니다. 나는 당신의 행 번호가 내 것과 일치하지 않는다는 것을 알아 냈다. 그래서 나는 이것이 현재의 3.2.3 릴리즈보다 더 빨리 파이썬 3.2라고 생각한다.

자, 코드는 Linux의 Python 3.2.3에서 작동합니다. 충돌에 대한 수정을 포함하여 zipfile 및 zlib와 관련된 여러 가지 버그 수정이있는 것처럼 보이는 최신 3.2.x로 업데이트하는 것이 좋습니다.

+0

3.2 및 3.1을 사용해 보았습니다. 같은 오류가있는 것 같습니다. 위의 글에서 내 편집을보세요. – Rox

+0

아니요, 최신 Python 3.2를 설치해야합니다. _3.2.3_입니다. –

관련 문제