我正尝试使用python脚本从中国服务提供商(我不是中国自己的)下载文件。提供者给我一个.zip文件,其中包含一个文件,其中似乎有中文字符。这似乎是导致zipfile模块barf。Python zipfile模块不能提取带有中文字符的文件名
代码:
import zipfile
f = "/path/to/zip_file.zip"
if zipfile.is_zipfile(f):
fz = zipfile.ZipFile(f, 'r')
zip文件本身不包含任何非ASCII字符,但里面的文件它。当我运行上面的脚本,我得到以下异常:
Traceback (most recent call last): File "./temp.py", line 9, in <module>
fz = zipfile.ZipFile(f, 'r') File "/usr/lib/python2.7/zipfile.py", line 770, in __init__
self._RealGetContents() File "/usr/lib/python2.7/zipfile.py", line 859, in _RealGetContents
x.filename = x._decodeFilename() File "/usr/lib/python2.7/zipfile.py", line 379, in _decodeFilename
return self.filename.decode('utf-8') File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError: 'utf8' codec can't decode byte 0xbd in position 30: invalid start byte
我已经试过翻翻答案,很多类似的问题:
- Read file with Chinese Characters
- Extract zip files with non-unicode filenames
- Extract files with invalid characters
请纠正我,如果我错了,但它看起来li ke an open issue with the zipfile module。
我该如何解决这个问题?是否有任何替代模块处理我应该使用的zip文件?或者其他解决方案?
TIA。
编辑: 我可以通过linux命令行实用程序“unzip”完全访问/解压缩同一文件。
“它有一个预示着里面的文件名被编码成UTF-8的标志”我从来没有听说过标志。哪里会找到它? – 2016-12-09 23:30:45
对不起,我没有在我的问题中提到这一点,但我可以通过linux命令行实用程序“unzip”完全访问/解压缩它。所以我怀疑这是否是文件本身的问题。 – hyperwiser
@Rhymoid:文件属性标志字的第11位,请参见[PKware appnote](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT)sec 4.1.4:“如果设置了此位,则这个文件的文件名和注释字段必须使用UTF-8进行编码“。 hyperwiser:通过任何一种工具处理文件来判断文件的有效性是不明智的。当然,一个早于UTF-8标志的工具会忽略它,就像一个不关心编码的面向字节的工具一样。除了野外工具对ZIP的各种不确定边缘情况的各种反应之外,还有很多不同之处。 – bobince