转载 

Python中ZipFile解压文件名中文乱码的问题

分类:python    580人阅读    IT小君  2022-10-05 20:18

原因分析

zipfile.py中ZipFile在初始化时执行了_RealGetContents方法,目的是读取目录结构,其中关于文件名编码的处理是这样的:

 

# 第42行
if flags & 0x800:
    # UTF-8 file names extension
    filename = filename.decode('utf-8')
else:
    # Historical ZIP filename encoding
    filename = filename.decode('cp437')

要么是utf-8要么是cp437,然而咱们在windows平台上压缩包文件名编码大多是gbk,这里用cp437解码了,所以会乱码

解决办法

只需要将filename重新编码cp437解码成gbk就好了,网络上大多数做法是对解压后的文件和目录操作,不太优雅。优雅一点点的方式是直接修改ZipFile对象中的filename

首先找到filename存在于哪里,同样在_RealGetContents这个函数中找到如下代码

# 第49行
x = ZipInfo(filename)
... # 省略若干行
# self是ZipFile对象
# 第67行
self.filelist.append(x)
self.NameToInfo[x.filename] = x

所以至少有两处存在filename

  • 列表filelist存储的ZipInfo对象的filename属性
  • 字典NameToInfo的键

加个补丁函数把这两处改了试试,代码如下:

from zipfile import ZipFile


def support_gbk(zip_file: ZipFile):
    name_to_info = zip_file.NameToInfo
    # copy map first
    for name, info in name_to_info.copy().items():
        real_name = name.encode('cp437').decode('gbk')
        if real_name != name:
            info.filename = real_name
            del name_to_info[name]
            name_to_info[real_name] = info
    return zip_file


with support_gbk(ZipFile(r'./里面有中文.zip')) as zfp:
    zfp.extractall(r'./中文不乱码')

 

点击广告,支持我们为你提供更好的服务

html5 canvas进度条圆环图表统计动画特效

js+css3抽奖转盘旋转点餐代码

响应式咖啡饮品宣传网站模板

canvas炫酷鼠标移动文字粒子特效

有机水果蔬菜HTML5网站模板

HTML5 Canvas竖直流动线条背景动画特效

现代时尚家具公司网站模板

中小型创意设计服务公司网站模板

HTML5现代家居装潢公司网站模板

jQuery右端悬浮带返回顶部特效

小众时尚单品在线电子商务网站模板

响应式时尚单品在线商城网站模板

html5 svg夜空中星星流星动画场景特效

css鼠标跟随文字模糊特效

响应式太阳能能源公司网站模板

html5图标下拉搜索框自动匹配代码

html5 canvas彩色碎片组合球形旋转动画特效

css+js实现的颜色渐变数字时钟动画特效

网页设计开发公司网站模板

HTML5数字产品服务公司网站模板

点击广告,支持我们为你提供更好的服务
 工具推荐 更多»
点击广告,支持我们为你提供更好的服务