2017-02-27 81 views
0

我试图用zipfile.extractAll解压文件通过Python的,但它给了BAD zip文件,所以我想这:无法解压缩的文件夹中的Python

zipfile cant handle some type of zip data?

如该答复中提到,我使用的代码:

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("Truncating 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 enter code here 

,但它给了错误

Message File Name Line Position Traceback
C:\Users\aditya1.r\Desktop\Python_pyscripter\module1.py 50
main C:\Users\aditya1.r\Desktop\Python_pyscripter\module1.py 17
fixBadZipfile C:\Users\aditya1.r\Desktop\Python_pyscripter\module1.py 37
TypeError: 'str' does not support the buffer interface

我正在使用Python 3.4

我该如何解压这个文件?

回答

0

您正在阅读的文件作为bytes对象,但试图找到传递string对象,因此只是简单地改变这条线 -

pos = data.find('\x50\x4b\x05\x06') 

pos = data.find(b'\x50\x4b\x05\x06') 

请注意,我已将它铸造成一个字节对象,只需预先设置b即可。

你不需要这样做是Python 2.X,但是在python 3.X中,你需要明确地将string对象序列化为byte对象。

+0

还是同样的错误。它显示文件被截断。 –

+0

@AdityaRohilla我不认为它有同样的错误,这次你的else语句跑了,这意味着它成功地搜索了文件,但没有找到你通过的东西。 – hashcode55

+0

zip文件有问题吗?我可以找到解压缩的方法吗? –

0
import subprocess 

subprocess.Popen('unzip ' + file_name, shell = True).wait() 

希望这有助于你:)

+0

你能解释一下这是如何工作的吗?不显示任何输出解压缩文件。 –

+0

@AdityaRohilla想象一下,你想解压文件“example.zip”,然后运行你的python脚本,其中“example.zip”是。这不会输出任何内容,但是如果您检查“example.zip”所在的文件夹,您会发现解压缩文件。当你写''unzip'+ file_name'的子进程就像你在写命令行一样。如果你需要更多的帮助,只需要问! – 1pa

+0

仍然没有帮助。该程序只是等待zip文件没有任何改变。 –