在 Python 中,遍歷文件和目錄可以使用 os
、pathlib
等模塊。以下是一些高效遍歷文件和目錄的方法:
使用 os.walk()
os.walk()
是一個高效的遞歸遍歷指定目錄及其子目錄的方法,它返回一個生成器,生成一個三元組 (root, dirs, files)
。這里 root
是當前目錄的路徑,dirs
是該目錄下的子目錄列表,files
是該目錄下的文件列表。
import osdef traverse_directory(directory):for root, dirs, files in os.walk(directory):print(f"Current directory: {root}")print("Directories:")for d in dirs:print(os.path.join(root, d))print("Files:")for f in files:print(os.path.join(root, f))traverse_directory('.')
使用 pathlib.Path
.rglob('*')是 pathlib.Path中的一種方法,用于遞歸地匹配目錄及其所有子目錄中的所有文件和目錄。它返回一個生成器,生成匹配的Path對象,適用于高效遍歷文件系統。
以下是如何使用 `pathlib.Path` 和 `.rglob('*')` 方法的示例:
### 使用 `pathlib.Path.rglob('*')` 遍歷目錄和文件
from pathlib import Pathdef traverse_directory(directory):path = Path(directory)for item in path.rglob('*'):if item.is_dir():print(f"Directory: {item}")elif item.is_file():print(f"File: {item}")
# 調用函數遍歷當前目錄并處理文件
traverse_directory('.')
### .rglob('*')?的優點
1. **遞歸遍歷**:rglob?會遞歸遍歷目錄及其所有子目錄。
2. **簡單語法**:使用 pathlib.Path?的方法,可以更簡潔和面向對象地處理路徑。
3. **跨平臺**:pathlib提供了跨平臺的路徑操作,確保在不同操作系統上的兼容性。
進一步優化
如果需要對文件進行特定處理,可以在遍歷過程中添加相應的邏輯:
from pathlib import Pathdef process_file(file_path):# 自定義處理邏輯print(f"Processing file: {file_path}")def traverse_directory(directory):path = Path(directory)for item in path.rglob('*'):if item.is_file():process_file(item)# 調用函數遍歷當前目錄并處理文件
traverse_directory('.')
這種方法使得代碼更加模塊化和可維護。你可以根據具體需求修改 process_file函數來處理文件,比如讀取文件內容、過濾特定類型的文件、統計文件數量等。
示例:統計文件數量和目錄數量
以下示例展示了如何使用 rglob?統計目錄中所有文件和目錄的數量:
from pathlib import Pathdef count_files_and_directories(directory):file_count = 0dir_count = 0path = Path(directory)for item in path.rglob('*'):if item.is_file():file_count += 1elif item.is_dir():dir_count += 1return file_count, dir_count# 調用函數并打印結果
file_count, dir_count = count_files_and_directories('.')
print(f"Total files: {file_count}")
print(f"Total directories: {dir_count}")
通過使用 pathlib.Path?和 .rglob('*'),你可以高效、簡潔地遍歷文件和目錄,并進行各種操作和統計。
使用 os.listdir()
os.listdir()
函數返回指定目錄下的所有文件和目錄,但不會遞歸遍歷子目錄。
import osdef traverse_directory(directory):for item in os.listdir(directory):full_path = os.path.join(directory, item)if os.path.isdir(full_path):print(f"Directory: {full_path}")elif os.path.isfile(full_path):print(f"File: {full_path}")traverse_directory('.')