zipfile模塊——讀取(查看)zip壓縮文件


import zipfile

exampleZip = zipfile.ZipFile('C:\\Users\\del\\Desktop\\新建文件夾 (2)\\新建文件夾 (2).zip')

for zip_file in exampleZip.namelist():
try:
zip_file = zip_file.encode('cp437').decode('gbk')
except:
zip_file = zip_file.encode('utf-8').decode('utf-8')
print(zip_file)

exampleZip.close();
Python3中zipfile模塊文件名亂碼問題
inux下zip文件亂碼已經是一個常見問題了,再加上python想不遇到亂碼問題都難。 在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.infolist()方法獲得的info中取得filename name = info.filename try: #使用cp437對文件名進行解碼還原 name = name.encode('cp437') #win下一般使用的是gbk編碼 name = name.decode("gbk") except: #如果已被正確識別為utf8編碼時則不需再編碼 pass

 

執行結果:

新建文件夾1/
新建文件夾1/新建文件夾/
新建文件夾1/新建文本文檔 (2).txt
新建文件夾1/新建文本文檔.txt
新建文本文檔1.txt

====================================================================================================

 

 

import zipfile

exampleZip = zipfile.ZipFile('C:\\Users\\del\\Desktop\\新建文件夾 (2)\\新建文件夾 (2).zip')

print(exampleZip.namelist())

for zip_file in exampleZip.namelist():
    try:
        zip_file = zip_file.encode('cp437').decode('gbk')
    except:
        zip_file = zip_file.encode('utf-8').decode('utf-8')
    print(zip_file)


print(exampleZip.getinfo('11.txt'))   #獲取某個文件的詳細信息的方法


xx = exampleZip.getinfo('11.txt')

print(xx.filename)   #代表文件名字
print(xx.file_size)   #代表原文件的大小
print(xx.compress_size)  #代表壓縮后文件的大小


exampleZip.close()

 

 

執行結果:

['11/', '11/2/', '11/22.txt', '11/222.txt', '11.txt']
11/
11/2/
11/22.txt
11/222.txt
11.txt
<ZipInfo filename='11.txt' external_attr=0x20 file_size=0>
11.txt
0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM