Python中使⽤zipfile以及中⽂乱码问题
上⼀篇使⽤7zip压缩备份⽂件之后,我⽤zipfile 查看⽂件信息时,因为含有中⽂⽂件名,出现了乱码。花了很久检查这个问题。
写在前⾯:使⽤7zip压缩的时候记得 -mcu,指定使⽤utf-8编码⽂件名,后⾯就没这么多P事。
zip_command = '"D:\\Program Files (x86)\\7-Zip\\7z.exe" a -tzip -mcu {0} {1} '.format(target, ' '.join(source))
思路⼤概是:
1. 编码问题 -> Python 默认unicode 编码问题还是 windos编码问题?还是PyCharm编码问题?
2. CMD命令⾏中是否有这个问题?
3. 查看各个编码(, )
4. 尝试在 i.filename 后⾯各种 encode / decode; 包括gbk,utf-8/-16,big5, 2312;在PyCharm和CMD⾥都尝试了;
5. 尝试⽆果,最终在下⾯⽂章⾥到⼀句话“WinZip将所有⽂件名解释为在CP437中编码,也称为DOS Latin”。使⽤cp437 解决
问题。参考⽂档:
print('\nfilename', de('cp437').decode('gbk'))
6. 注意:使⽤ zipfile.ad 读取压缩⽂件时,指定⽂件使⽤“/”分隔路径,不需要使⽤双反斜杠“\\”
f.open('fold/New Text Document ⽂档.txt').read().decode('gbk')
使⽤-mcu压缩⽂件以后,中⽂⽂件名不再乱码,下⾯代码中以及注释掉encode('cp437').decode('gbk'))。
import sys
import locale
import zipfile
# sys.setdefaultencoding('utf8')
defaultencoding())
filesystemencoding())
print(ding)
print(sys.stdout.isatty())
preferredencoding())
t = 'D:\\test\\Backup\\20180815140640.zip'
print(zipfile.is_zipfile(t))
f = zipfile.ZipFile(t)
print('filename is', f.filename)
print('namelist is', f.namelist)
# 如果压缩时没有使⽤utf-8 编码,WinZip将所有⽂件名解释为在CP437中编码,也称为DOS Latin # zipfile 函数中⽂乱码情况,需要encode('cp437') 再 decode('gbk')python中文文档
# print('first item is', f.namelist()[0].encode('cp437').decode('gbk'))
# print('second item is', f.namelist()[1].encode('cp437').decode('gbk'))
print('first item is', f.namelist()[0])
print('second item is', f.namelist()[1])
print('infolist is', f.infolist())
for i in f.infolist():
# print('\nfilename', de('cp437').decode('gbk'))
print('\nfilename', i.filename)
print('\tComment:', iment)
print('\tModified:', i.date_time)
print('\tSystem:', i.create_system, '(0 = Windows, 3 = Unix)')
print('\tCompressed:', ipress_size, 'bytes')
print('\tUncompressed:', i.file_size, 'bytes')
print('\textra:', i.extra)
print('\tcreate_system:', i.create_system)
print('\tcreate_version:', i.create_version)
print('\textract_version:', i.extract_version)
print('\textract_version:', i.reserved)
print('\tflag_bits:', i.flag_bits)
print('\tvolume:', i.volume)
print('\tinternal_attr:', i.internal_attr)
print('\texternal_attr:', i.external_attr)
print('\theader_offset:', i.header_offset)
print('\tCRC:', i.CRC)
# 压缩⽂件⾥fold ⽂件夹下的 New Text Document ⽂档.txt
print('\nTxt content is:', f.open('fold/New Text Document ⽂档.txt').read().decode('gbk'))
print('\nTxt content is:', f.open(f.namelist()[3]).read().decode('gbk'))
# 解压缩全部项⽬
# 解压第⼆个项⽬,第⼀个为⽬录fold
f.close()
付:
# info(name) ⽅法返回的是⼀个ZipInfo对象,表⽰zip⽂档中相应⽂件的信息。它⽀持如下属性:
# ZipInfo.filename:        获取⽂件名称。
# ZipInfo.date_time:        获取⽂件最后修改时间。返回⼀个包含6个元素的元组:(年, ⽉, ⽇, 时, 分, 秒)
# ZipInfopress_type:    压缩类型。
# ZipInfoment:          ⽂档说明。
# :            扩展项数据。
# ate_system:    获取创建该zip⽂档的系统。
# ate_version:  获取 创建zip⽂档的PKZIP版本。
# act_version:  获取 解压zip⽂档所需的PKZIP版本。
# served:        预留字段,当前实现总是返回0。
# ZipInfo.flag_bits:        zip标志位。
# ZipInfo.volume:          ⽂件头的卷标。
# ZipInfo.internal_attr:    内部属性。
# al_attr:    外部属性。
# ZipInfo.header_offset:    ⽂件头偏移位。
# ZipInfo.CRC:              未压缩⽂件的CRC-32。
# ZipInfopress_size:    获取压缩后的⼤⼩。
# ZipInfo.file_size:        获取未压缩的⽂件⼤⼩。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。