如果我们用python的zipfile库去解压zip文件的话,若有文件名为中文的文件或文件夹,解压之后文件名会是乱码,如图
乱码
按文中所说,这个Bug的原因是,zipfile库中根据文件flag检测的时候,只考虑了utf-8和cp437两种情况,如果实际是gbk等其他编码时就变为乱码了,所以解决的方法在于先按cp437 encode后,重新按gbk编码去decode;此外,还有一部分字符需要用utf-8的解码方式(2020.6.10遇到),在except中处理。
网上文章很多,最方便的还是先用extractall()批量解压,再批量重命名。基于这篇文章的代码(感谢作者),我写了一个完整版的函数,提供给大家:
import os
def rename_garbled_filenames(path):
def rename(root_path, filename):
try:
oldpath = os.path.join(root_path, filename)
try:
newfilename = filename.encode('cp437').decode('gbk')
except:
newfilename = filename.encode('utf-8').decode('utf-8')
newpath = os.path.join(root_path, newfilename)
os.rename(oldpath, newpath)
except Exception as e:
print('error:', e)
# 先重命名文件
for root_path, dir_names, file_names in os.walk(path):
for filename in file_names:
rename(root_path, filename)
# 再重命名文件夹:不能在一次os.walk()里同时重命名文件和文件夹,会有问题
for root_path, dir_names, file_names in os.walk(path):
for dirname in dir_names:
rename(root_path, dirname)
网友评论