当前位置: 首页 > news >正文

python3 zipfile解压出错_解决python3中解压zip文件是文件名乱码的问题

在zip标准中,对文件名的 encoding 用的不是 unicode,而可能是各种软件根据系统的默认字符集来采用(此为猜测),因此zipfile中根据文件 flag 检测的时候,只支持 cp437 和 utf-8。

具体就是查找 zipfile.py 源代码找到下面的代码:

1: if flags & 0x800:

2: # UTF-8 file names extension

3: filename = filename.decode('utf-8')

4: else:

5: # Historical ZIP filename encoding

6: filename = filename.decode('cp437')

可见编码被正确识别为utf8时的情况外,都会被识别并decode为cp437编码,但如果实际是gbk等其他编码时就变为乱码了。所以解决的方法在于被decode为cp437后重新再手动转为正确的编码。

具体代码如下:

#修改代码

if flags & 0x800:

# UTF-8 file names extension

filename = filename.decode('utf-8')

else:

# Historical ZIP filename encoding

filename = filename.decode('cp437')

#修改

filename = filename.encode("cp437").decode('gbk')

后面一处同样如此修改

if zinfo.flag_bits & 0x800:

# UTF-8 filename

fname_str = fname.decode("utf-8")

else:

fname_str = fname.decode("cp437")

#修改

fname_str = fname_str.encode("cp437").decode('gbk')

亲测有效!

以上这篇解决python3中解压zip文件是文件名乱码的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章:

  • jmeter 线程执行顺序_面试官:线程顺序执行,这么多答案你都答不上来?
  • python可变参数的特点_Java可变参数 Python可变参数 Scala可变参数
  • mysql 多列合并为一列_mysql面试名词聚簇索引、二级索引、最左匹配、覆盖索引、回表
  • 备份类型 事务日志_InnoDB事务日志redo log和undo log详解
  • 被呼叫方拒绝接收呼叫_外包呼叫中心的“前世今生”培训课件6/12
  • 检测到有程序正在访问网络_花旗银行、eBay等网站窃取访问者隐私信息 Behave可监测网站行为...
  • 对象删除某个属性_了解Pandas索引对象:索引对象介绍,索引重建方法等
  • c4.5决策树算法python_决策树之python实现C4.5算法
  • wpf将文字转化为图形_photoshop 2020将任意形状或文本转化为图框并填充图像实例...
  • python清洗数据 food ounces animal_利用Python进行数据分析-Pandas(第四部分-数据清洗和准备)...
  • 高级灰rgb数值_美商海盗船七夕巨献:教你用RGB辨认口红色号
  • python房子代码_用python爬取租房网站信息的代码
  • python中if in是什么意思_if语句中“ in”的使用和含义?
  • 利用python爬虫电影分析_python 爬虫分析30年香港电影
  • 汇编 无法修改显存中的内容_汇编语言
  • ----------
  • export和import的用法总结
  • express如何解决request entity too large问题
  • JavaScript HTML DOM
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • session共享问题解决方案
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • swift基础之_对象 实例方法 对象方法。
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 飞驰在Mesos的涡轮引擎上
  • 分布式熔断降级平台aegis
  • 搞机器学习要哪些技能
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • ------- 计算机网络基础
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 我建了一个叫Hello World的项目
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 昨天1024程序员节,我故意写了个死循环~
  • #、%和$符号在OGNL表达式中经常出现
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (Git) gitignore基础使用
  • (ros//EnvironmentVariables)ros环境变量
  • (二)PySpark3:SparkSQL编程
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (三十五)大数据实战——Superset可视化平台搭建
  • (转)Mysql的优化设置
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net mvc部分视图
  • .net 中viewstate的原理和使用
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET6实现破解Modbus poll点表配置文件
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .Net中ListT 泛型转成DataTable、DataSet
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹