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

python使用zipfile解压中文乱码问题的更多相关文章

  1. python使用zipfile解压文件中文乱码问题

    中文在编程中真实后娘养的,各种坑爹,python3下中文乱码这个问题抓破了头皮,头疼.看了alex的文章,才有种恍然大悟的感觉(链接在底部). 一句话,就是转换成unicode,压缩前是什么编码,使用 ...

  2. python3 解决zip解压中文乱码问题,亲测可用, ZipFile

    中文乱码是个很头疼的问题,找了好久都没用找到解决办法 后来也忘了在哪儿找到的解决办法, 很久以前了,但不可行, 解决了思路 在源码里面想要修改内容 if flags & 0x800: # UT ...

  3. Net Core解决ZipFile解压中文出现乱码

    一.在main方法中添加 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 二.解压添加 //sourceArchiveFi ...

  4. zipfile 解压文件名乱码

    zipfile 中文文件名 解压乱码 上传文件功能模块需求及BUG现象: 环境 mac django 1.11.13 python 3.6 功能需求: 上传一个.zip格式的压缩文件 解压该test. ...

  5. ubuntu rar文件解压中文乱码问题

    http://blog.csdn.net/android_huber/article/details/7382867 前段时间经常要在ubuntu系统中去解压rar的文件,但是每次解压出来却总是出现中 ...

  6. 解决unzip解压中文乱码问题

    使用 unzip XXX.zip 方式解压的时候会出现中文乱码 很多人推荐以下方式: 在windows执行命令,可显示字符集数字一般为936: # chcp // 解压时加上-O cp936,xxx为 ...

  7. unzip解压中文乱码

    1 问题描述 直接 unzip xxx.zip 乱码,肯定是编码问题了不用问.但是unzip没有指定编码的选项: 网上的解决方案如下: unzip -O GBK/GB18030CP936 xx.zip ...

  8. FMX Android ZIP解压中文乱码

    在手机上解压了一个WINDOWS上的压缩文件, 发现中文是乱码的,解决方法如下: 找到System.zip.pas文件 将E := TEncoding.GetEncoding(437);   改为 E ...

  9. Linux 下 zip 文件解压中文乱码

    windows下的中文文件名拷贝到ubuntu下面以后,文件名直接变成乱码,原因为windows下的文件名以GBK编码,而Ubuntu下的文件 名为utf-8编码 1. ubuntu下有一个工具可以用 ...

随机推荐

  1. jQuery中如何解决多库冲突问题

    方法一:使用noConflict():舍弃$,$用jQuery代替jQuery.noConflict(); 方法二:自定义变量:舍弃$,新定义一个$y变量来代替$var $y = jQuery.noC ...

  2. c/c++设置图片为透明图

    在绘制图片的时候先把源位图填充背景设置为白色 例如:m_bufferpicture.FillSolidRect(0,0,m_nWidth,m_nHeight,RGB(255,255,255));//这 ...

  3. 【go】go语言socket通信样例

    server.go package main import ( "net" "fmt" "io" ) func main() { liste ...

  4. 【WebService】使用jaxb完成对象和xml的转换

    package com.slp.jxmarshaller; /** * Created by sanglp on 2017/2/26. */ public class ClassName { priv ...

  5. 转载-解决使用httpClient 4.3.x登陆 https时的证书报错问题

    今天在使用httpClient4.3.6模拟登陆https网站的时候出现了证书报错的问题,这是在开源中国社区里找到的可行的答案(原文链接:http://www.oschina.net/question ...

  6. 使用ThreadLocal在线程内部传递数据

    最近在项目中使用到了JDK提供的线程池,遇到了在多线程环境下在线程内部共享数据的问题 使用ThreadLocal 来解决线程内部共享数据的问题 定义BO package com.unicom.uclo ...

  7. 【BZOJ4424】Cf19E Fairy DFS树

    [BZOJ4424]Cf19E Fairy Description 给定 n 个点,m 条边的无向图,可以从图中删除一条边,问删除哪些边可以使图变成一个二分图. Input 第 1 行包含两个整数 n ...

  8. 【BZOJ1045】[HAOI2008] 糖果传递 贪心

    [BZOJ1045][HAOI2008] 糖果传递 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正 ...

  9. springMVC各个包下的作用

    spring的jar各包作用spring.jar是包含有完整发布的单个jar包,spring.jar中包含除了spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下 ...

  10. Redis构建文章聚合信息分类网站

    本系列教程内容提要 Java工程师之Redis实战系列教程教程是一个学习教程,是关于Java工程师的Redis知识的实战系列教程,本系列教程均以解决特定问题为目标,使用Redis快速解决在实际生产中的 ...