Fix error: “BadZipfile: File is not a zip file”

Zip files always open in Windows without any error as we all have used several files that are zipped. But when you talk about using the zip file in Python programming, you may have encountered the error: “BadZipfile: File is not a zip file”. When you are trying to work on Python, you may get a few errors when you run the command or compile the set of commands, which is common. There is no need to worry. We are here to solve the issue you are facing.

Let’s have a look at how you get the error

How does the error: “BadZipfile: File is not a zip file” pop up

When you try to open 2 zip file using the Python zipfile module, you will get to open only one, and the other one return error. Check out the code

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
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

Now that you have seen how error occurs. Let’s figure out the solutions to fix it

Solutions to Fix error: “BadZipfile: File is not a zip file”

Solution 1 – Avoid File named File

The cause of the error is the use of the name File with File as it can confuse Python. You need to rename these files to solve the error. In the case, the renaming doesn’t work, then you can follow the below code

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

If it also doesn’t work the way it should, then follow the code below

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

In this way, you can solve the error warning.

Solution 2 – use 7zip

Another solution to fix the error, you can download 7zip, and then keep it in the folder where you have the script. Once done, follow the code

import subprocess
ziploc = "C:/Program Files/7-Zip/7z.exe" #location where 7zip is installed
cmd = [ziploc, 'e',your_Zip_file.zip ,'-o'+ OutputDirectory ,'-r' ] 
sp = subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)

You can also use gzip.GzipFile instead of zipfile module.

Conclusion

We have highlighted the ideal solution to fix the error: “BadZipfile: File is not a zip file”. All the solutions discussed are effective and help you tack the error warning.

Reference Source:

https://python-forum.io/thread-32833.html

https://stackoverflow.com/questions/3083235/unzipping-file-results-in-badzipfile-file-is-not-a-zip-file

Leave a Reply

Your email address will not be published. Required fields are marked *