如何使用 Python 從 zip 檔案中提取所有 .txt 檔案?
多個檔案可以使用 ZIP 檔案進行壓縮並一起儲存,ZIP 檔案在資料操作和檔案管理領域很常見。Python 是一種靈活且強大的語言,它提供了許多模組來無縫處理 ZIP 檔案。從 ZIP 檔案中提取特定檔案(例如所有 .txt 檔案)是一個常見的任務。本文將深入探討如何使用 Python 從 ZIP 檔案中提取所有 .txt 檔案的過程。我們將逐步講解原理,並提供一些實際的程式碼示例來說明該過程。
從 ZIP 檔案中提取所有檔案
首先,讓我們學習如何從 ZIP 檔案中提取所有檔案。此示例將為我們後續提取和過濾 .txt 檔案的其他示例奠定基礎。以下是關鍵點:
示例
在這裡,我們定義了一個名為 extract_all_files 的方法,它接收 ZIP 檔案路徑和要提取到的資料夾作為引數。使用 zipfile,我們可以開啟 ZIP 檔案。使用以讀取模式 ('r') 開啟的 ZipFile() 和 extractall() 函式,將所有檔案提取到指定的目的地資料夾。
import zipfile
def extract_all_files(zip_file_path, extract_to):
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
zip_ref.extractall(extract_to)
# Example usage
zip_file_path = 'my_archive.zip'
extract_to = 'destination_folder'
extract_all_files(zip_file_path, extract_to)
提取特定檔案型別
現在我們已經瞭解瞭如何從 ZIP 檔案中提取所有檔案,我們可以專注於提取特定檔案型別,特別是 .txt 檔案。我們可以透過迭代 ZIP 檔案中的檔案列表並僅選擇副檔名為 .txt 的檔案來實現這一點。檢視以下程式碼:
示例
在這段程式碼中,我們迴圈遍歷 zip_ref.infolist() 返回的檔案詳細資訊列表。我們使用 endswith() 函式檢查每個檔案的名稱是否以 .txt 結尾。如果是,我們使用 zip_ref.extract() 函式將該特定檔案提取到指定的目的地資料夾。
import zipfile
def extract_txt_files(zip_file_path, extract_to):
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
for file_info in zip_ref.infolist():
if file_info.filename.endswith('.txt'):
zip_ref.extract(file_info, extract_to)
# Example usage
zip_file_path = 'my_archive.zip'
extract_to = 'destination_folder'
extract_txt_files(zip_file_path, extract_to)
將檔案提取到特定的目錄結構
在許多情況下,在從 ZIP 檔案中提取資料時保持目錄結構至關重要。例如,如果 ZIP 檔案包含資料夾,我們可能希望在提取過程中保留這些資料夾。讓我們看看如何做到這一點:
示例
在此示例中,我們使用 os.path.join() 構造目標檔案路徑,以確保提取的檔案儲存在正確的目錄結構中。file_info.filename 提供了檔案中 ZIP 檔案中的相對路徑,透過使用 os.path.join() 函式將此路徑與提取目錄連線,從而生成最終檔案路徑。
import zipfile
import os
def extract_txt_files_with_structure(zip_file_path, extract_to):
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
for file_info in zip_ref.infolist():
if file_info.filename.endswith('.txt'):
file_path = os.path.join(extract_to, file_info.filename)
zip_ref.extract(file_info, file_path)
# Example usage
zip_file_path = 'my_archive.zip'
extract_to = 'destination_folder'
extract_txt_files_with_structure(zip_file_path, extract_to)
提取具有字首的檔案
有時,我們可能希望提取具有特定字首的檔案,而不管其副檔名如何。例如,我們可能希望提取所有名稱中包含“data_”的檔案。讓我們看看如何做到這一點:
示例
在此程式碼片段中,我們使用 startswith() 函式檢查每個檔案的名稱是否以所需的字首開頭。如果是,我們保留該特定檔案的相對路徑結構,並在將其提取到目標位置時進行保留。
import zipfile
import os
def extract_files_with_prefix(zip_file_path, extract_to, prefix):
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
for file_info in zip_ref.infolist():
if file_info.filename.startswith(prefix):
file_path = os.path.join(extract_to, file_info.filename)
zip_ref.extract(file_info, file_path)
# Example usage
zip_file_path = 'my_archive.zip'
extract_to = 'destination_folder'
prefix = 'data_'
extract_files_with_prefix(zip_file_path, extract_to, prefix)
使用自定義提取函式提取檔案
如果某些特定情況需要我們執行更復雜的提取操作會怎樣?這可以透過使用自定義提取函式來實現。請參閱如何將其付諸實踐:
示例
在此示例中,定義了一個名為 custom_extraction_func() 的自定義提取函式。它接收一個 file_info 物件作為輸入,並根據某些條件返回 True 或 False。在這種情況下,自定義條件是 .txt 副檔名和大於 1024 位元組的檔案大小。
ZIP 檔案路徑、目標資料夾和特定的提取函式作為引數傳遞給 custom_extract() 函式。然後,每個 ZIP 檔案中的檔案都會進行自定義提取函式呼叫,並且僅當函式返回 True 時才會執行提取。
import zipfile
import os
def custom_extraction_func(file_info):
# Your custom condition here
return file_info.filename.endswith('.txt') and file_info.file_size > 1024
def custom_extract(zip_file_path, extract_to, extraction_func):
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
for file_info in zip_ref.infolist():
if extraction_func(file_info):
file_path = os.path.join(extract_to, file_info.filename)
zip_ref.extract(file_info, file_path)
# Example usage with the custom_extraction_func
zip_file_path = 'my_archive.zip'
extract_to = 'destination_folder'
custom_extract(zip_file_path, extract_to, custom_extraction_func)
結論
在這篇深入的文章中,我們探討了如何使用 Python 的靈活 zipfile 模組從 ZIP 檔案中提取所有 .txt 檔案。首先,我們理解了 zipfile 模組和 ZIP 檔案的基礎知識。
然後,我們提供了幾個實際的程式碼示例,涵蓋了各種情況,包括提取所有檔案、提取特定檔案型別、保持目錄結構、提取具有字首的檔案以及建立自定義提取例程。
憑藉您新獲得的專業知識,您現在可以輕鬆地在 Python 中處理 ZIP 檔案。zipfile 模組為您提供了強大的功能來處理複雜的檔案操作,使您可以無限地管理和修改 ZIP 檔案。因此,請大膽嘗試,利用您的 Python 技能充分發揮 ZIP 檔案的潛力!
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP