python使用zipfile解压中文乱码问题
在zipfile.ZipFile中获得的filename有中日文则很大可能是乱码,这是因为
在zip标准中,对文件名的 encoding 用的不是 unicode,而可能是各种软件根据系统的默认字符集来采用(此为猜测),而zipfile中根据文件 flag 检测的时候,只支持 cp437 和 utf-8。
具体zipfile模块中的源代码如下
if flags & 0x800:
# UTF-8 file names extension
filename = filename.decode('utf-8')
else:
# Historical ZIP filename encoding
filename = filename.decode('cp437')
可见编码被正确识别为utf8时的情况外,都会被识别并decode为cp437编码,但如果实际是gbk等其他编码时就变为乱码了。所以解决的方法在于被decode为cp437后重新再手动转为正确的编码。
在实际过程中可以对已经先用zipfile进行解压,然后对unzip文件夹中的乱码文件直接进行重命名。具体实现过程如下:
import os
def an_garcode(dir_names):
"""anti garbled code"""
os.chdir(dir_names)
for temp_name in os.listdir('.'):
try:
#使用cp437对文件名进行解码还原
new_name = temp_name.encode('cp437')
#win下一般使用的是gbk编码
new_name = new_name.decode("gbk")
#对乱码的文件名及文件夹名进行重命名
os.rename(temp_name, new_name)
#传回重新编码的文件名给原文件名
temp_name = new_name
except:
#如果已被正确识别为utf8编码时则不需再编码
pass
if os.path.isdir(temp_name):
#对子文件夹进行递归调用
an_garcode(temp_name)
#记得返回上级目录
os.chdir('..')
an_garcode(os.getcwd())
---------------------
直接上最后成功代码,使用cp437可以正确读取部分,但是还有一部分却打印出来\u的编码,
因为看了alex的文章,又在catch中加上了utf-8的解码方式
#-*- coding: utf-8 -*-
import zipfile # 默认模式r,读
azip = zipfile.ZipFile("/Users/a/my_file/feise.zip", 'r')
# 返回所有文件夹和文件
zip_list = azip.namelist()
for zip_file in zip_list:
print(zip_file)
print(zip_file.encode('utf-8'))
try:
zip_file = zip_file.encode('cp437').decode('gbk')
except:
zip_file = zip_file.encode('utf-8').decode('utf-8')
print(zip_file)
一句话,就是转换成unicode,压缩前是什么编码,使用什么编码encode再decode回gbk、utf-8
一句话,就是转换成unicode,压缩前是什么编码,使用什么编码encode再decode回来
先看测试代码:
|
1
2
3
4
5
6
7
8
9
10
|
#-*- coding: utf-8 -*-import zipfile# 默认模式r,读azip = zipfile.ZipFile("/Users/a/my_file/feise.zip", 'r')# 返回所有文件夹和文件zip_list = azip.namelist()for zip_file in zip_list: print(zip_file) print(zip_file.encode('utf-8')) |
python使用zipfile解压中文乱码问题的更多相关文章
- python使用zipfile解压文件中文乱码问题
中文在编程中真实后娘养的,各种坑爹,python3下中文乱码这个问题抓破了头皮,头疼.看了alex的文章,才有种恍然大悟的感觉(链接在底部). 一句话,就是转换成unicode,压缩前是什么编码,使用 ...
- python3 解决zip解压中文乱码问题,亲测可用, ZipFile
中文乱码是个很头疼的问题,找了好久都没用找到解决办法 后来也忘了在哪儿找到的解决办法, 很久以前了,但不可行, 解决了思路 在源码里面想要修改内容 if flags & 0x800: # UT ...
- Net Core解决ZipFile解压中文出现乱码
一.在main方法中添加 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 二.解压添加 //sourceArchiveFi ...
- zipfile 解压文件名乱码
zipfile 中文文件名 解压乱码 上传文件功能模块需求及BUG现象: 环境 mac django 1.11.13 python 3.6 功能需求: 上传一个.zip格式的压缩文件 解压该test. ...
- ubuntu rar文件解压中文乱码问题
http://blog.csdn.net/android_huber/article/details/7382867 前段时间经常要在ubuntu系统中去解压rar的文件,但是每次解压出来却总是出现中 ...
- 解决unzip解压中文乱码问题
使用 unzip XXX.zip 方式解压的时候会出现中文乱码 很多人推荐以下方式: 在windows执行命令,可显示字符集数字一般为936: # chcp // 解压时加上-O cp936,xxx为 ...
- unzip解压中文乱码
1 问题描述 直接 unzip xxx.zip 乱码,肯定是编码问题了不用问.但是unzip没有指定编码的选项: 网上的解决方案如下: unzip -O GBK/GB18030CP936 xx.zip ...
- FMX Android ZIP解压中文乱码
在手机上解压了一个WINDOWS上的压缩文件, 发现中文是乱码的,解决方法如下: 找到System.zip.pas文件 将E := TEncoding.GetEncoding(437); 改为 E ...
- Linux 下 zip 文件解压中文乱码
windows下的中文文件名拷贝到ubuntu下面以后,文件名直接变成乱码,原因为windows下的文件名以GBK编码,而Ubuntu下的文件 名为utf-8编码 1. ubuntu下有一个工具可以用 ...
随机推荐
- http协议详解-摘抄
引言 HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展.目前在WWW中使用的是HTTP/ ...
- DAG 的最短路径算法
求图中节点的单源最短路径可以使用Dijkstra,BellmanFord, SPFA算法,而对于有向无环图DAG来说,可以通过简单的动态规划来进行求解. DAG的独特之处是所有节点可以线性化( ...
- C++中的三种继承public,protected,private
( c++默认class是private继承且class内的成员默认都是private struct 默认位public 继承,struct内成员默认是public ) 三种访问权限 public: ...
- 深入浅出Docker(二):Docker命令行探秘
1. Docker命令行 Docker官方为了让用户快速了解Docker,提供了一个交互式教程,旨在帮助用户掌握Docker命令行的使用方法.但是由于Docker技术的快速发展,此交互式教程已经无法满 ...
- (转)从程序员到CTO
好好努力吧,向优秀的人看齐.文章来自http://blog.csdn.net/smarttony/article/details/6697617
- TCP关闭连接(为什么会能Time_wait,Close_wait?)
版权声明:本文由胡文斌原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/102 来源:腾云阁 https://www.qclo ...
- 微信Android热补丁实践演进之路
版权声明:本文由张绍文原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/81 来源:腾云阁 https://www.qclou ...
- Excel 中如何快速统计一列中相同字符的个数(函数法)
https://jingyan.baidu.com/article/6d704a132ea17328da51ca78.html 通过excel快速统计一列中相同字符的个数,如果很少,你可以一个一个数. ...
- centos7上开启单用户模式
author: headsen chen date : 2018-08-02 11:23:16 1,在出现centos7的页面的时候,按 e进入到编译内核的界面 2,找到下面的这一段,将ro 该车 ...
- mysql 5.7如何添加用户
MySQL5.7 添加用户.删除用户与授权 转自:https://www.cnblogs.com/xujishou/p/6306765.html mysql -uroot -proot MySQL5 ...