Skip to main content
 首页 » 编程设计

python之压缩文件编码错误

2025年05月04日16wuhuacong

我有几个文件想用 zipfile 压缩,但是当文件名带有图形重音符号时出现一个错误。

我的文件列表:

  • Adriano Araújo.zip
  • André Cerqueira.zip
  • Paulo Henrique Guiné.zip

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

  • 阿德里亚诺·阿拉·jo.zip
  • AndrÚ Cerqueira.zip
  • Paulo GuinÚ.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 module documentation :

Note: There is no official file name encoding for ZIP files. If you have unicode file names, you must convert them to byte strings in your desired encoding before passing them to write(). WinZip interprets all file names as encoded in CP437, also known as 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 替换为 ? 问号,这在某些文件系统上也是不允许的,因此我们将其替换为 _ 下划线。 警告:这会导致文件名重复!