Python 2.7的tarfile模块处理非UTF-8文件名报错如何忽略编码错误?
Python 2.7 tarfile模块非UTF-8文件名编码错误解决方案
你遇到的UnicodeDecodeError报错是因为Python 2.7的tarfile模块默认使用UTF-8解码压缩包内的文件名,当文件名采用GBK、GB2312、Shift-JIS等其他编码时就会解码失败。另外你当前代码中使用的errors='surrogateescape'参数仅支持Python 3.1及以上版本,在Python 2.7环境下不会生效。
可用解决方案
方案1:指定对应文件名编码
如果已知压缩包的文件名编码(比如Windows环境打包的tar包大多使用GBK编码),直接在打开文件时传入对应编码即可:
# 示例为GBK编码场景,可根据实际情况替换为对应编码 tar_obj = tarfile.open(infile, 'r', encoding='gbk')
方案2:强制忽略解码错误(适配未知编码场景)
如果不清楚压缩包的文件名编码,可通过errors='ignore'参数丢弃无法解码的字节,避免报错中断执行:
tar_obj = tarfile.open(infile, 'r', encoding='utf-8', errors='ignore')
方案3:手动处理原始文件名(兼容性最高)
如果忽略编码后仍出现提取失败、文件名乱码等问题,可手动处理文件名的原始字节,兼容多编码场景:
if tar_flag: tar_obj = tarfile.open(infile, 'r') try: member_list = tar_obj.getmembers() for member in member_list: if member.isfile(): # 优先尝试GBK解码,失败后再用UTF-8忽略错误解码,可根据实际场景调整顺序 try: file_name = member.name.decode('gbk') except UnicodeDecodeError: file_name = member.name.decode('utf-8', errors='ignore') if file_name.lower().endswith('.exe'): # 直接传入member对象而非解码后的文件名,避免匹配失败 tar_obj.extract(member, path='/home/tar/') print 'extracting {}'.format(file_name) except Exception as err: print err
注意事项
- Python 2.7环境下不要使用
surrogateescape作为错误处理参数,该特性仅在Python 3中可用 - 提取后文件名存在乱码时,优先确认压缩包制作时的操作系统默认编码,对应修改解码规则即可
- 调用
extract方法时优先传入member对象,不要传入解码后的文件名,避免因编码不匹配导致找不到对应文件
内容的提问来源于stack exchange,提问作者Bruce Banner
相关产品推荐
相关产品推荐

