新聞中心
在zipfile.ZipFile中獲得的filename有中日文則很大可能是亂碼,這是因為

創(chuàng)新互聯(lián)是專業(yè)的靈山網(wǎng)站建設(shè)公司,靈山接單;提供成都網(wǎng)站設(shè)計、做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行靈山網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
在 zip 標(biāo)準(zhǔn)中,對文件名的 encoding 用的不是 unicode,而可能是各種軟件根據(jù)系統(tǒng)的默認(rèn)字符集來采用(此為猜測),而zipfile 中根據(jù)文件 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等其他編碼時就變?yōu)閬y碼了。所以解決的方法在于被decode為cp437后,重新再手動轉(zhuǎn)為正確的編碼。
在實際過程中可以對已經(jīng)先用zipfile進行解壓,然后對unzip文件夾中的亂碼文件直接進行重命名。具體實現(xiàn)過程如下:
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):
#對子文件夾進行遞歸調(diào)用
an_garcode(temp_name)
#記得返回上級目錄
os.chdir('..')
an_garcode(os.getcwd())眾多python培訓(xùn)視頻,盡在python學(xué)習(xí)網(wǎng),歡迎在線學(xué)習(xí)!
網(wǎng)站題目:創(chuàng)新互聯(lián)Python教程:pythonzipfile出現(xiàn)亂碼怎么解決
URL網(wǎng)址:http://m.fisionsoft.com.cn/article/cdejesp.html


咨詢
建站咨詢
