如何在 Python 中查詢目錄中所有副檔名為 .txt 的檔案?


在目錄中搜索特定檔案是一項可以使用 Python 工具輕鬆完成的任務;在某些情況下,您可能需要使用 Python 查詢目錄中所有副檔名為 .txt 的檔案。讓我們深入探討此任務中涉及的過程,並向您展示如何使用易於理解的程式碼示例以及解釋來實現此查詢目錄中所有副檔名為 .txt 的檔案的任務的不同方法。

使用 os.listdir()

在此程式碼示例中,我們首先匯入 os 模組,該模組對於在 Python 中處理目錄和檔案至關重要。

示例

find_txt_files() 函式以 directory_path 作為其引數;directory_path 表示您希望搜尋的目錄的路徑。

我們使用 os.listdir(directory_path) 獲取所有專案(即指定目錄中的檔案和目錄)的列表。

透過對每個專案進行迭代並使用 os.path.isfile() 檢查它是否為檔案,我們確保我們只考慮檔案而不是目錄。

在第二個條件中,我們使用 item.endswith('.txt') 來僅檢索副檔名為 .txt 的檔案。

該函式輸出在目錄中找到的文字檔案的列表。

import os

def find_txt_files(directory_path):
   try:
      # Use os.listdir() to obtain a list of all items in the directory
      all_items = os.listdir(directory_path)

      # Filter out only the files with '.txt' extension
      txt_files = [item for item in all_items if 
os.path.isfile(os.path.join(directory_path, item)) and item.endswith('.
txt')]

      return txt_files

   except FileNotFoundError:
      print(f"Error: The directory '{directory_path}' does not exist.")
      return []

# Replace 'directory_path' with the path of the directory you want to 
search
directory_path = '/path/to/your/directory'
txt_files_list = find_txt_files(directory_path)

if txt_files_list:
   print("Text files in the directory:")
   for file_name in txt_files_list:
      print(file_name)
else:
   print("No .txt files found in the directory.")

輸出

對於某個目錄,獲得了以下輸出

Text files in the directory:
fubar.txt

使用 os.listdir()

示例

在本例中,我們首先匯入 os 模組,該模組使我們能夠與作業系統、目錄和檔案進行互動。

find_txt_files() 函式接受 directory_path 作為其引數。directory_path 表示您希望搜尋 .txt 檔案的目錄的路徑。

部署 os.listdir(directory_path) 函式以獲取所有專案的列表,即指定目錄中的檔案和目錄。

透過迭代每個專案並使用 os.path.isfile() 檢查它是否為檔案,我們確保我們只考慮檔案並忽略目錄。

在第二個例項中,我們部署 item.endswith('.txt') 以僅查詢副檔名為 .txt 的檔案。

發現該函式返回在目錄中找到的 .txt 檔案的列表。

import os

def find_txt_files(directory_path):
   try:
      # Get a list of all items (files and directories) in the specified 
directory
      all_items = os.listdir(directory_path)

      # Filter out only the files with the '.txt' extension
      txt_files = [item for item in all_items if os.path.isfile(os.path.
join(directory_path, item)) and item.endswith('.txt')]

      return txt_files

   except FileNotFoundError:
      print(f"Error: The directory '{directory_path}' does not exist.")
      return []
# Replace 'directory_path' with the path of the directory you want to 
search
directory_path = '/path/to/your/directory'
txt_files_list = find_txt_files(directory_path)

if txt_files_list:
   print("Text files in the directory:")
   for file_name in txt_files_list:
      print(file_name)
else:
   print("No .txt files found in the directory.")

輸出

對於某個目錄,獲得了以下輸出

Text files in the directory:
fubar.txt

使用 os.scandir() 提高效率

示例

這裡,os.listdir() 被 os.scandir() 替換,以便提供一種更有效的方式來列出目錄中的檔案。

當 os.scandir(directory_path) 的輸出用作條目列表時,會建立一個上下文管理器,該管理器可以有效地迭代目錄條目,並且無需在之後顯式關閉目錄。

透過使用 entry.is_file(),檢查每個條目是否為檔案,如果發現是檔案,則繼續檢查它是否以 .txt 結尾。

發現該函式返回在目錄中找到的 .txt 檔案的列表。

import os

def find_txt_files(directory_path):
   try:
      # Use os.scandir() for a more efficient listing
      with os.scandir(directory_path) as entries:
         txt_files = [entry.name for entry in entries if entry.is_file() 
and entry.name.endswith('.txt')]

      return txt_files

   except FileNotFoundError:
      print(f"Error: The directory '{directory_path}' does not exist.")
      return []
# Replace 'directory_path' with the path of the directory you want to 
search
directory_path = '/path/to/your/directory'
txt_files_list = find_txt_files(directory_path)

if txt_files_list:
   print("Text files in the directory:")
   for file_name in txt_files_list:
      print(file_name)
else:
   print("No .txt files found in the directory.")

輸出

對於某個目錄,獲得了以下輸出

Text files in the directory:
fubar.txt

使用 os.walk() 進行遞迴搜尋

示例

在此特定示例中,我們使用 os.walk() 來實現對 .txt 檔案的遞迴搜尋,包括子目錄。

然後 os.walk(directory_path) 函式返回一個生成器,該生成器繼續提供包含根目錄、子目錄和該目錄中檔案的元組。

迭代每個元組,對於 files 列表中的每個檔案,我們部署 file.endswith('.txt') 來查詢它是否以 .txt 副檔名結尾。

如果它確實以該副檔名結尾,我們使用 os.path.join(root, file) 構造完整的檔案路徑,並將該檔案新增到 txt_files 列表中。

該函式最終返回在目錄及其子目錄中找到的 .txt 檔案的完整列表。

import os

def find_txt_files(directory_path):
   try:
      # Use os.walk() to get a recursive listing of all files
      txt_files = []
      for root, dirs, files in os.walk(directory_path):
         for file in files:
            if file.endswith('.txt'):
               txt_files.append(os.path.join(root, file))

      return txt_files

   except FileNotFoundError:
      print(f"Error: The directory '{directory_path}' does not exist.")
      return []
# Replace 'directory_path' with the path of the directory you want to 
search
directory_path = '/path/to/your/directory'
txt_files_list = find_txt_files(directory_path)

if txt_files_list:
   print("Text files in the directory:")
   for file_name in txt_files_list:
      print(file_name)
else:
   print("No .txt files found in the directory.")

輸出

對於某個目錄,獲得了以下輸出

Text files in the directory:
/content/foo/fubar.txt

使用 pathlib.Path() 進行現代列表

示例

在這個最後的示例中,我們採用最新且現代的方法來執行相同的列表任務,方法是使用 pathlib.Path()。

我們最初從 pathlib 模組匯入 Path;此模組為處理目錄和檔案提供了一個面向物件的介面。

透過 Path(directory_path) 建立一個指向指定目錄的 Path 物件。

透過使用 path.iterdir() 獲取目錄中包含檔案和目錄的所有條目的迭代器。

file.is_file() 函式用於檢查每個條目是否為檔案,如果它確實是一個檔案,我們使用 file.suffix 檢查它是否具有 .txt 字尾。

如果滿足所有這些條件,則將檔案包含在 txt_files 列表中。

然後發現該函式返回在目錄中找到的 .txt 檔案的列表。

from pathlib import Path

def find_txt_files(directory_path):
    try:
        # Use pathlib.Path() for modern file listing
        path = Path(directory_path)
        txt_files = [file for file in path.iterdir() 
if file.is_file() and file.suffix == '.txt']

        return txt_files

    except FileNotFoundError:
        print(f"Error: The directory '{directory_path}' 
does not exist.")
        return []
# Replace 'directory_path' with the path of the 
directory you want to search
directory_path = '/path/to/your/directory'
txt_files_list = find_txt_files(directory_path)

if txt_files_list:
    print("Text files in the directory:")
    for file_name in txt_files_list:
        print(file_name)
else:
    print("No .txt files found in the directory.")

輸出

對於某個目錄,獲得了以下輸出

Text files in the directory:
/content/foo/fubar.txt

您命名它,您就可以得到它——四種使用 Python 在目錄中查詢所有副檔名為 .txt 的檔案的多樣且高效的方法。您始終可以選擇多種方法中的一種或多種,例如經典的 os.listdir()、高效的 os.scandir()、遞迴的 os.walk() 或現代的 pathlib.Path(),以滿足您的特定需求。在學習了這些程式碼示例和解釋之後,您現在擁有了一個多功能工具包,可以自動化檔案搜尋並輕鬆優雅地組織您的 Python 專案。

透過練習這些簡潔優雅的程式碼片段,您可以輕鬆地找到任何目錄中所有副檔名為 .txt 的檔案。Python 的多功能性和易用性使其成為處理與檔案相關的任務的絕佳選擇,無論您是在管理資料、組織檔案還是處理文字檔案以進行分析。

更新於: 2023-07-28

1K+ 次瀏覽

啟動你的 職業生涯

透過完成課程獲得認證

開始
廣告