不积跬步,无以至千里;不积小流,无以成江海。

Dean's blog

  • Join Us on Facebook!
  • Follow Us on Twitter!
  • LinkedIn
  • Subcribe to Our RSS Feed

解决Python zipfile解压后中文乱码的问题

Python中可以使用zipfile库处理zip文件的压缩和解压的问题。但是如果文件名或目录名中存在中文,zipfile解压后就会出现乱码的问题。通过网络和查zipfile库代码,在解压的时候,只针对utf-8和cp437编码作处理:

if flags & 0x800:
    # UTF-8 file names extension
    filename = filename.decode('utf-8')
else:
    # Historical ZIP filename encoding
    filename = filename.decode('cp437')

但由于每个操作系统的默认编码不同,例如中文操作系统一般是GBK编码,这样就会导致解压的时候,出现乱码的情况。

解决这个问题,网上有三种解决办法:

办法一:在压缩的时候,就指定编码

由于zipfile只识utf-8和cp437,那么直接指定其中一种编码就可以。例如,使用7zip压缩的时候记得 -mcu,指定使用utf-8编码文件名,例如:

zip_command = '"D:\\Program Files (x86)\\7-Zip\\7z.exe" a -tzip -mcu {0} {1} '.format(target, ' '.join(source))

但这个有局限性,自己压缩的还能指定编码,如果是用户上传的,就没办法了。

办法二:直接修改源代码

Python是坏果仁开发的,坏果仁有些习惯和天朝有所不同,那么就把这些习惯改成咱们的习惯,这样咱们用户起来最省事,完全不用多一行代码。例如将上面的代码改成:

if flags & 0x800:
    # UTF-8 file names extension
    filename = filename.decode('utf-8')
else:
    # Historical ZIP filename encoding
    filename = filename.decode('gbk')

但是这个也有问题,如果程序在其它机器上部署时,或默认编码不是gbk时,依然会有同样的问题出现。

办法三:通过重命名改成正确的名称

这个办法的思路是,由于zipfile压缩后的文件名是经过utf-8或cp437编码的,那么对输出的文件名或目录名做解码,再将编码成合适的编码就可以。例如:

def corrector(folder):
    '''
    解决zipfile解压后,文件名乱码的问题
    '''
    os.chdir(folder)
    for temp_name in os.listdir('.'):
        try:
            new_name = temp_name.encode('cp437').decode('gbk')
        except:
            new_name = temp_name.encode('utf-8').decode('utf-8')

        if(new_name != temp_name):
            #对乱码的文件名及文件夹名进行重命名
            os.rename(temp_name, new_name)
            #传回重新编码的文件名给原文件名
            temp_name = new_name

        if os.path.isdir(temp_name):
            #对子文件夹进行递归调用
            corrector(temp_name)
            #记得返回上级目录
            os.chdir('..')

an_garcode(os.getcwd())

这个办法也不能解决所有问题,例如当不是UTF-8或CP437时,但仍然可以用这个思路解决之。

相关链接

python 之路,致那些年,我们依然没搞明白的编码 https://www.cnblogs.com/alex3714/articles/7550940.html

Python - zipfile 乱码问题解决 https://www.cnblogs.com/ligaofeng/p/11280001.html

python3 zipfile解压中文乱码问题解决 https://blog.csdn.net/mp9105/article/details/80288549

Python 中使用 zipfile 以及中文乱码问题 https://blog.csdn.net/zzphapy/article/details/81703539

不允许评论
粤ICP备17049187号-1