#解压数据集
!unzip -o data/data109838/QF_data.zip
编码不能被正确识别为utf-8的时候,会被是被识别并decode为cp437编码,如果是gbk编码的话就会变成乱码,有两种方法:
filename = file.encode('cp437').decode('gbk')
zip格式中并没有指定编码格式,Windows下生成的zip文件中的编码是GBK/GB2312等,因此,导致这些zip文件在Linux下解压时出现乱码问题,因为Linux下的默认编码是UTF8。
解决办法:
unzip -O cp936 *.zip -d ./dirname
通过【1】发现:shutil用的解压的函数是基于zipfile的,于是我又去搜索了一下zipfile解压中文乱码怎么办。经过一番搜寻,我解决了。
import zipfile
import os
import sys
def unzipFile(oriPath,goalPath):
'''
解决解压zip包时的中文乱码问题
:param oriPath: 压缩文件的地址
:param goalPath: 解压后存放的的目标位置
:return: None
'''
with zipfile.ZipFile(file=oriPath, mode='r') as zf:
# 解压到指定目录,首先创建一个解压目录
unzip_dir_path = goalPath
if not os.path.exists(unzip_dir_path):
os.mkdir(unzip_dir_path)
for old_name in zf.namelist():
# 获取文件大小,目的是区分文件夹还是文件,如果是空文件应该不好用。
file_size = zf.getinfo(old_name).file_size
# 由于源码遇到中文是cp437方式,所以解码成gbk,windows即可正常
new_name = old_name.encode('cp437').decode('gbk')
# 拼接文件的保存路径
new_path = os.path.join(unzip_dir_path, new_name)
# 判断文件是文件夹还是文件
if file_size > 0:
# 是文件,通过open创建文件,写入数据
with open(file=new_path, mode='wb') as f:
# zf.read 是读取压缩包里的文件内容
f.write(zf.read(old_name))
else:
# 是文件夹,就创建
os.mkdir(new_path)
def main(oriPath,goalPath):
unzipFile(oriPath=oriPath,goalPath=goalPath)
main(sys.argv[1], sys.argv[2])
新的问题——当第一个层文件夹是中文时仍会出现乱码
后来在使用这份代码进行很多压缩包批量解压的时候却遇到了问题。问题是这样:
FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\aishare\Desktop\UserName\Python类的学习\result\人工智能/2019级网络安全8班-2018302080185-李一舟.docx'
这个问题的原因我也找到了:
这是因为这个压缩包第一层是个中文文件夹:
然后在遍历的时候,由于中文名字的错乱,导致代码没有先创建这一层文件夹。直接创建了李一舟这个docx文档,所以会报出人工智能这一层文件夹路径不存在的错误。
而如果是这一种:
程序就不会报错。
经过一番思考,我决定用这样的思路来解决。