2010-06-21 32 views
28

Tôi có hai tệp zip, cả hai tệp đều mở tốt với Windows Explorer và 7-zip.giải nén kết quả tệp trong "BadZipFile: Tệp không phải là tệp zip"

Tuy nhiên, khi tôi mở chúng bằng mô-đun zipfile của Python [zipfile.ZipFile ("filex.zip")], một trong số chúng được mở nhưng một trong số đó cung cấp lỗi "BadZipfile: File is not a zip file".

Tôi đã đảm bảo rằng tệp thứ hai là tệp Zip hợp lệ bằng cách mở tệp bằng 7-Zip và xem các thuộc tính của nó (nói 7Zip.ZIP). Khi tôi mở tệp bằng trình chỉnh sửa văn bản, hai ký tự đầu tiên là "PK", cho biết rằng đó thực sự là tệp zip.

Tôi đang sử dụng Python 2.5 và thực sự không có bất kỳ đầu mối nào về việc này. Tôi đã thử nó cả với Windows cũng như Ubuntu và vấn đề tồn tại trên cả hai nền tảng.

Cập nhật: Traceback từ Python 2.5.4 trên Windows:

Traceback (most recent call last): 
File "<module1>", line 5, in <module> 
    zipfile.ZipFile("c:/temp/test.zip") 
File "C:\Python25\lib\zipfile.py", line 346, in init 
    self._GetContents() 
File "C:\Python25\lib\zipfile.py", line 366, in _GetContents 
    self._RealGetContents() 
File "C:\Python25\lib\zipfile.py", line 378, in _RealGetContents 
    raise BadZipfile, "File is not a zip file" 
BadZipfile: File is not a zip file 

Về cơ bản khi hàm _EndRecData được gọi để lấy dữ liệu từ End Trung Directory" kỷ lục, các kiểm tra chiều dài bình luận không [endrec [ . 7] == len (bình luận)]

các giá trị của người dân địa phương trong _EndRecData chức năng như sau:

END_BLOCK: 4096, 
comment: '\x00', 
data: '\xd6\xf6\x03\x00\x88,N8?<e\xf0q\xa8\x1cwK\x87\x0c(\x82a\xee\xc61N\'1qN\x0b\x16K-\x9d\xd57w\x0f\xa31n\xf3dN\x9e\xb1s\xffu\xd1\.....', (truncated) 
endrec: ['PK\x05\x06', 0, 0, 4, 4, 268, 199515, 0], 
filesize: 199806L, 
fpin: <open file 'c:/temp/test.zip', mode 'rb' at 0x045D4F98>, 
start: 4073 
+5

Có thể là: http://bugs.python.org/issue1757072? –

+0

Cố gắng chạy lệnh unix 'file' trên cả hai tệp của bạn. Có thể nó sẽ cho bạn một số đầu mối. –

+0

Đối với cả hai tệp, dữ liệu lưu trữ Zip, ít nhất là v2.0 để trích xuất – sharjeel

Trả lời

1

Hiển thị truy xuất đầy đủ mà bạn nhận được từ Python - điều này có thể gợi ý vấn đề cụ thể là gì. Chưa được trả lời: Phần mềm nào đã tạo ra tệp không đúng và trên nền tảng nào?

Cập nhật: Traceback chỉ có vấn đề phát hiện các "End of Central Directory" kỷ lục trong file - xem chức năng _EndRecData bắt đầu từ dòng 128 của C: \ Python25 \ Lib \ zipfile.py

Gợi ý:
(1) Theo dõi thông qua chức năng trên
(2) Dùng thử trên Python mới nhất
(3) Trả lời câu hỏi ở trên.
(4) Đọc this và bất cứ điều gì khác được tìm thấy bởi google("BadZipfile: File is not a zip file") rằng dường như có liên quan

+0

Windows, Python 2.5.2: Traceback (gần đây nhất gọi cuối cùng): File "", dòng 5, trong zipfile.ZipFile ("c: /temp/test.zip") File "C: \ Python25 \ lib \ zipfile.py ", dòng 346, trong __init__ self._GetContents() Tệp" C: \ Python25 \ lib \ zipfile.py ", dòng 366, trong _GetContents self._RealGetContents() Tệp" C: \ Python25 \ lib \ zipfile.py ", dòng 378, trong _RealGetContents tăng BadZipfile," Tệp không phải là tệp zip " BadZipfile: Tệp không phải là tệp zip – sharjeel

+0

Đây là phiên bản được định dạng của traceback: http: // dpaste.de/X0Pb/ – sharjeel

+0

Cảm ơn cho liên kết. Tôi đã trải qua nó nhưng điều đó không giúp được gì. Được thử nghiệm trên Python 2.5.4, 2.6.5 trên Windows và Python 2.5.2 trên Ubuntu 64 bit. – sharjeel

-1

Các bạn đã thử một con trăn mới hơn, hoặc nếu đó là quá nhiều rắc rối, chỉ cần một zipfile.py mới hơn? Tôi đã sử dụng thành công một bản sao của zipfile.py từ Python 2.6.2 (mới nhất vào thời điểm đó) với Python 2.5 để mở một số tệp zip không được hỗ trợ bởi mô-đun zipfile Py2.5s.

+0

Có Tôi đã thử nó với 2.6.5 là tốt. Sự cố vẫn tiếp diễn :( – sharjeel

8

tập tin có tên tập tin có thể nhầm lẫn giữa python - hãy thử đặt tên cho nó cái gì khác. nếu nó VẪN wont work, hãy thử mã này:

def fixBadZipfile(zipFile): 
f = open(zipFile, 'r+b') 
data = f.read() 
pos = data.find('\x50\x4b\x05\x06') # End of central directory signature 
if (pos > 0): 
    self._log("Trancating file at location " + str(pos + 22)+ ".") 
    f.seek(pos + 22) # size of 'ZIP end of central directory record' 
    f.truncate() 
    f.close() 
else: 
    # raise error, file is truncated 
4

Tôi chạy vào cùng một vấn đề. Vấn đề của tôi là nó là một gzip thay vì một tập tin zip. Tôi chuyển sang lớp gzip.GzipFile và nó hoạt động như một sự quyến rũ.

6

giải pháp của astronautlevel hoạt động trong hầu hết các trường hợp, nhưng dữ liệu nén và CRC trong Zip cũng có thể chứa cùng 4 byte.Bạn nên làm rfind (không phải find), tìm kiếm vị trí + 20 và sau đó thêm ghi \x00\x00 vào cuối tệp (cho biết các ứng dụng zip có độ dài của phần 'nhận xét' dài 0 byte).


    # HACK: See http://bugs.python.org/issue10694 
    # The zip file generated is correct, but because of extra data after the 'central directory' section, 
    # Some version of python (and some zip applications) can't read the file. By removing the extra data, 
    # we ensure that all applications can read the zip without issue. 
    # The ZIP format: http://www.pkware.com/documents/APPNOTE/APPNOTE-6.3.0.TXT 
    # Finding the end of the central directory: 
    # http://stackoverflow.com/questions/8593904/how-to-find-the-position-of-central-directory-in-a-zip-file 
    # http://stackoverflow.com/questions/20276105/why-cant-python-execute-a-zip-archive-passed-via-stdin 
    #  This second link is only losely related, but echos the first, "processing a ZIP archive often requires backwards seeking" 
    content = zipFileContainer.read() 
    pos = content.rfind('\x50\x4b\x05\x06') # reverse find: this string of bytes is the end of the zip's central directory. 
    if pos>0: 
     zipFileContainer.seek(pos+20) # +20: see secion V.I in 'ZIP format' link above. 
     zipFileContainer.truncate() 
     zipFileContainer.write('\x00\x00') # Zip file comment length: 0 byte length; tell zip applications to stop reading. 
     zipFileContainer.seek(0) 

    return zipFileContainer
Các vấn đề liên quan