用python解压数据集失败,并且显示乱码,怎么解决的?


#解压数据集
!unzip -o data/data109838/QF_data.zip


img

编码不能被正确识别为utf-8的时候,会被是被识别并decode为cp437编码,如果是gbk编码的话就会变成乱码,有两种方法:

  1. 指定GBK:unzip -O GBK filename.zip;
  2. 先将文件名先使用cp437编码encode,然后再用gbk编码decode
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文档,所以会报出人工智能这一层文件夹路径不存在的错误。
而如果是这一种:

程序就不会报错。
经过一番思考,我决定用这样的思路来解决。