Python:BadZipFile:目录和标题中的文件名不同
Posted
技术标签:
【中文标题】Python:BadZipFile:目录和标题中的文件名不同【英文标题】:Python : BadZipFile: File name in directory and header differ 【发布时间】:2019-12-03 14:47:26 【问题描述】:我正在使用这个方法来提取这个zipfile。
r = requests.get(url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall("Documents_zip") #This is where the error occurs
我从 Python 得到这个错误:
BadZipFile: File name in directory '2017-08-29_Cerfa_CpC_Ombi+¿res_Lac_Th+⌐sauque.pdf' and header b'2017-08-29_Cerfa_CpC_Ombi\xc3\xa8res_Lac_Th\xc3\xa9sauque.pdf' differ.
我对zipfile模块不太了解,但发现它太严格了,没有必要检查文件名和文件头。
如何在不引发错误的情况下提取?
编辑 1:
我创建了这个函数来避免引发错误。它只是返回一个布尔值来指示是否运行了 zip 提取。
def download_zip(z, path):
if not(z.testzip()):
z.extractall(path)
return True
else:
return False
【问题讨论】:
看起来文件名和标题编码外来字符的方式可能存在问题 - 它正在努力解决的路径是什么?您使用的 zip 文件可能没有正确标记其字符编码。 此 zip 文件看起来已损坏。尝试在 Python 之外的命令行上解压缩。 @user727089 您应该尝试使用python'szipfile
as a command-line argument to check validity using the -t
flag,因为并非所有实用程序都会以相同的方式反映有效性。
很好的建议,@AriCooper-Davis!我学到了一些新东西:)
@AriCooper-Davis 是这样的,路径无所谓,如果我不指定它会引发同样的错误
【参考方案1】:
我完成了之前的功能。
它将 zip 文件提取到文件夹 namde path
中。如果出现问题,则更改当前目录的名称并指示损坏文件的数量。
该函数也返回这个数字。
import os
import zipfile
def download_zip(z, path):
names_files = z.namelist()
count = 0
for my_file in names_files:
if my_file:
if z.testzip():
if not(my_file in z.testzip()):
try:
z.extract(my_file, path=path)
except zipfile.BadZipfile:
count = count +1
else:
z.extract(my_file, path=path)
else:
count = count + 1
if count != 0:
my_path = os.getcwd()
parent = os.path.dirname(my_path)
os.chdir(parent)
os.rename(my_path, my_path + ' - ' + str(count) + ' doc du zip non extrait')
os.chdir(my_path + ' - ' + str(count) + ' doc du zip non extrait')
return count
【讨论】:
以上是关于Python:BadZipFile:目录和标题中的文件名不同的主要内容,如果未能解决你的问题,请参考以下文章
Requests.get(zipfile) 获取“BadZipFile:文件不是 zip 文件”