zoukankan      html  css  js  c++  java
  • 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'))
     
     
     
     
     
  • 相关阅读:
    C#+ArcEngine10.0+SP5实现鼠标移动动态显示要素属性信息
    C#中实现excel文件批量导入access数据表中
    C#子窗体闪烁问题解决
    C#打印代码运行时间
    TableLayoutPanel导致的闪屏问题
    线段余弦角+凸包算法
    ICommand相关知识
    批量导出access某表内容到word文档
    通过数组里的时间重新排序数组
    数组层级叠加
  • 原文地址:https://www.cnblogs.com/klb561/p/10000639.html
Copyright © 2011-2022 走看看