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\' ))
|