[英]Error encoding zipfile
我有几个文件要用zipfile压缩,但是当文件名带有图形重音时会发生一个错误。
我的文件列表:
当我在filez.zip中压缩此文件时:
编码:
from zipfile_infolist import print_info
import zipfile
import os
import fileinput
import glob
files1 = glob.glob( '*.zip' )
for name in files1:
zf = zipfile.ZipFile('C:\Users\sergioH\files.zip', mode='a')
try:
zf.write('%(name)s' % {'name':name})
finally:
zf.close()
print
如何解决呢?
从zipfile
模块文档中 :
注意 :ZIP文件没有正式的文件名编码。 如果您具有unicode文件名,则必须在将它们传递给
write()
之前,将它们转换为所需编码的字节字符串。 WinZip将所有文件名解释为以CP437(也称为DOS Latin)编码。
您似乎在这里使用的文件名未编码为CP437。 您可能想对glob()
命令使用Unicode文件路径,因此Python返回Unicode文件名,然后在压缩时编码为CP437:
from string import maketrans
def encode_cp437(s, _noqmarks=maketrans('?', '_')):
return s.encode('cp437', errors='replace').translate(_noqmarks)
files1 = glob.glob(u'*.zip') # unicode path
with zipfile.ZipFile('C:\Users\sergioH\files.zip', mode='a') as zf:
for name in files1:
zf.write(name, encode_cp437(name))
请注意,我使用ZipFile
对象作为上下文管理器来确保它自动关闭,并只为列表中的每个文件名打开一次。
我还使用errors='replace'
来强制编码成功,即使存在CP437无法编码的代码点。 任何此类代码点均由Python替换为?
问号,在某些文件系统上也是不允许的,因此我们将它们替换为_
下划线。 警告 :这可能导致文件名重复!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.