基于Python實(shí)現(xiàn)讀取嵌套壓縮包下文件的方法
思路
- 打開(kāi)外層
zip壓縮包并遍歷文件:- 使用
with zipfile.ZipFile(outer_zip_path, 'r') as outer_zip語(yǔ)句以讀取模式'r'打開(kāi)用戶輸入的外層zip壓縮包對(duì)應(yīng)的文件,這樣在代碼塊結(jié)束后會(huì)自動(dòng)關(guān)閉該文件,避免資源泄露。 - 通過(guò)
outer_zip.namelist()獲取外層壓縮包內(nèi)所有文件和文件夾名稱(chēng)的列表,并進(jìn)行遍歷。針對(duì)每個(gè)文件名,使用if file_name.endswith('.zip')判斷是否為內(nèi)層壓縮包(即文件名以.zip結(jié)尾),如果是,則進(jìn)入后續(xù)處理內(nèi)層壓縮包的相關(guān)流程。
- 使用
- 處理內(nèi)層壓縮包相關(guān)信息:
- 首先,打印內(nèi)層壓縮包的名稱(chēng),方便用戶知曉當(dāng)前正在處理的內(nèi)層壓縮包情況。
- 接著,通過(guò)
inner_zip_data = outer_zip.read(file_name)讀取該內(nèi)層壓縮包的二進(jìn)制數(shù)據(jù),然后利用with zipfile.ZipFile(BytesIO(inner_zip_data), 'r') as inner_zip語(yǔ)句將讀取到的二進(jìn)制數(shù)據(jù)借助BytesIO模擬成一個(gè)臨時(shí)的zip文件對(duì)象,再次以讀取模式打開(kāi),以便后續(xù)操作。 - 之后,使用
inner_zip.namelist()獲取內(nèi)層壓縮包中的所有文件名列表,再進(jìn)行遍歷,逐個(gè)打印出這些文件名,展示內(nèi)層壓縮包包含的所有文件情況。
- 讀取內(nèi)層壓縮包中的文件內(nèi)容:
- 對(duì)于內(nèi)層壓縮包中的每個(gè)文件名,嘗試通過(guò)
file_data = inner_zip.read(inner_file_name)讀取文件的二進(jìn)制數(shù)據(jù)。 - 接著,嘗試以
utf-8編碼(假設(shè)文件內(nèi)容是UTF-8編碼,實(shí)際中可根據(jù)具體情況調(diào)整編碼方式)將讀取到的二進(jìn)制數(shù)據(jù)解碼為文本并打印出來(lái),通過(guò)print(file_data.decode('utf-8'))實(shí)現(xiàn),這樣能展示文件的內(nèi)容(如果是文本文件的話)。 - 同時(shí),使用
try-except塊來(lái)捕獲可能出現(xiàn)的錯(cuò)誤:- 如果出現(xiàn)
UnicodeDecodeError,說(shuō)明以utf-8編碼無(wú)法正確解碼文件內(nèi)容,很可能該文件不是文本文件,此時(shí)會(huì)打印相應(yīng)提示信息。 - 如果出現(xiàn)其他異常(通過(guò)
except Exception as e捕獲),則打印出具體的錯(cuò)誤信息,告知用戶讀取文件時(shí)出現(xiàn)了其他問(wèn)題。
- 如果出現(xiàn)
- 對(duì)于內(nèi)層壓縮包中的每個(gè)文件名,嘗試通過(guò)
完整代碼
以下是一個(gè)Python代碼示例,用于輸入一個(gè)外層zip壓縮包路徑,然后打印內(nèi)層壓縮包名、內(nèi)層壓縮包下的所有文件名,并讀取內(nèi)層壓縮包中的文件內(nèi)容(這里簡(jiǎn)單以文本形式打印讀取到的內(nèi)容,你可以根據(jù)實(shí)際文件類(lèi)型進(jìn)一步做針對(duì)性處理,比如是圖片、文檔等不同處理方式)。代碼中使用了zipfile模塊來(lái)處理zip壓縮包:
import zipfile
from io import BytesIO
def process_nested_zips(outer_zip_path):
with zipfile.ZipFile(outer_zip_path, 'r') as outer_zip:
# 遍歷外層壓縮包中的所有文件
for file_name in outer_zip.namelist():
if file_name.endswith('.zip'):
print(f"內(nèi)層壓縮包名: {file_name}")
# 將內(nèi)層壓縮包提取到臨時(shí)目錄(這里使用內(nèi)存中的BytesIO模擬臨時(shí)目錄,僅用于獲取信息,也可提取到實(shí)際磁盤(pán)目錄)
inner_zip_data = outer_zip.read(file_name)
with zipfile.ZipFile(BytesIO(inner_zip_data), 'r') as inner_zip:
inner_file_names = inner_zip.namelist()
print(f"{file_name} 下面的所有文件名:")
for inner_file_name in inner_file_names:
print(inner_file_name)
# 讀取內(nèi)層壓縮包中的文件內(nèi)容
try:
file_data = inner_zip.read(inner_file_name)
print(f"文件 {inner_file_name} 的內(nèi)容如下(以文本形式展示,若為非文本文件可能顯示亂碼):")
print(file_data.decode('utf-8')) # 假設(shè)文件內(nèi)容是UTF-8編碼,可根據(jù)實(shí)際調(diào)整
except UnicodeDecodeError:
print(f"文件 {inner_file_name} 無(wú)法以UTF-8編碼解碼,可能不是文本文件")
except Exception as e:
print(f"讀取文件 {inner_file_name} 時(shí)出現(xiàn)其他錯(cuò)誤: {str(e)}")
outer_zip_path = input("請(qǐng)輸入外層zip壓縮包的路徑:")
process_nested_zips(outer_zip_path)
代碼優(yōu)化
如果考慮到壓縮包中文件名可能存在編碼不一致等情況,可以對(duì)代碼進(jìn)行如下優(yōu)化,添加文件名編碼處理部分:
import zipfile
from io import BytesIO
def process_nested_zips(outer_zip_path):
with zipfile.ZipFile(outer_zip_path, 'r', encoding='utf-8') as outer_zip: # 設(shè)置外層壓縮包文件名編碼為utf-8,可根據(jù)實(shí)際調(diào)整
# 遍歷外層壓縮包中的所有文件
for file_name in outer_zip.namelist():
if file_name.endswith('.zip'):
print(f"內(nèi)層壓縮包名: {file_name}")
# 將內(nèi)層壓縮包提取到臨時(shí)目錄(這里使用內(nèi)存中的BytesIO模擬臨時(shí)目錄,僅用于獲取信息,也可提取到實(shí)際磁盤(pán)目錄)
inner_zip_data = outer_zip.read(file_name)
with zipfile.ZipFile(BytesIO(inner_zip_data), 'r', encoding='utf-8') as inner_zip: # 同樣設(shè)置內(nèi)層
inner_file_names = inner_zip.namelist()
print(f"{file_name} 下面的所有文件名:")
for inner_file_name in inner_file_names:
print(inner_file_name)
# 讀取內(nèi)層壓縮包中的文件內(nèi)容
try:
file_data = inner_zip.read(inner_file_name)
print(f"文件 {inner_file_name} 的內(nèi)容如下(以文本形式展示,若為非文本文件可能顯示亂碼):")
print(file_data.decode('utf-8')) # 假設(shè)文件內(nèi)容是UTF-8編碼,可根據(jù)實(shí)際調(diào)整
except UnicodeDecodeError:
print(f"文件 {inner_file_name} 無(wú)法以UTF-8編碼解碼,可能不是文本文件")
except Exception as e:
print(f"讀取文件 {inner_file_name} 時(shí)出現(xiàn)其他錯(cuò)誤: {str(e)}")
outer_zip_path = input("請(qǐng)輸入外層zip壓縮包的路徑:")
process_nested_zips(outer_zip_path)
在上述優(yōu)化后的代碼中,通過(guò)在打開(kāi)zip文件對(duì)象時(shí)(外層和內(nèi)層的ZipFile構(gòu)造函數(shù)中)設(shè)置encoding屬性為utf-8(可根據(jù)實(shí)際情況確定正確的編碼方式,比如有些可能是GBK等),來(lái)盡量避免因文件名編碼問(wèn)題導(dǎo)致的錯(cuò)誤,使得程序在處理包含不同編碼文件名的壓縮包時(shí)更加健壯。不過(guò)準(zhǔn)確判斷和設(shè)置正確的編碼可能需要額外的信息或者進(jìn)一步的測(cè)試驗(yàn)證等操作。
以上就是基于Python實(shí)現(xiàn)讀取嵌套壓縮包下文件的方法的詳細(xì)內(nèi)容,更多關(guān)于Python讀取嵌套壓縮包下文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
django-rest-swagger的優(yōu)化使用方法
今天小編就為大家分享一篇django-rest-swagger的優(yōu)化使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
python提取excel一列或多列數(shù)據(jù)另存為新表代碼實(shí)例
在日常的工作中,其實(shí)就是用鼠標(biāo)進(jìn)行數(shù)據(jù)篩選,然后選擇你想要這一行數(shù)據(jù)進(jìn)行復(fù)制,下面這篇文章主要給大家介紹了關(guān)于python提取excel一列或多列數(shù)據(jù)另存為新表的相關(guān)資料,需要的朋友可以參考下2024-06-06
python golang中g(shù)rpc 使用示例代碼詳解
這篇文章主要介紹了python golang中g(shù)rpc 使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
使用Python進(jìn)行QQ批量登錄的實(shí)例代碼
這篇文章主要介紹了使用Python進(jìn)行QQ批量登錄的實(shí)例代碼,代碼簡(jiǎn)單易懂非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06
python神經(jīng)網(wǎng)絡(luò)Keras實(shí)現(xiàn)LSTM及其參數(shù)量詳解
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)Keras實(shí)現(xiàn)LSTM及其參數(shù)量詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Pandas數(shù)據(jù)類(lèi)型之category的用法
Pandas中有一種特殊的數(shù)據(jù)類(lèi)型叫做category.它表示的是一個(gè)類(lèi)別,一般用在統(tǒng)計(jì)分類(lèi)中,比如性別,血型,分類(lèi),級(jí)別等等.有點(diǎn)像java中的enum,今天給大家詳細(xì)講解一下category的用法,需要的朋友可以參考下2021-06-06
pycharm軟件實(shí)現(xiàn)設(shè)置自動(dòng)保存操作
這篇文章主要介紹了pycharm軟件實(shí)現(xiàn)設(shè)置自動(dòng)保存操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06

