繁体   English   中英

压缩zip文件时出错

[英]Error encoding zipfile

我有几个文件要用zipfile压缩,但是当文件名带有图形重音时会发生一个错误。

我的文件列表:

  • AdrianoAraújo.zip
  • 安德烈·塞奎拉(AndréCerqueira).zip
  • Paulo HenriqueGuiné.zip

当我在filez.zip中压缩此文件时:

  • Adriano Ara·jo.zip
  • AndrÚCerqueira.zip
  • PauloGuinÚ.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM