import os
# 僅取得資料夾中的檔案名稱
folder_path = "sample_folder"
files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
print("資料夾中的檔案:")
print(files)
這段程式碼會逐一檢查項目是否為檔案,並將檔案名稱加入清單中。
使用範例
舉例來說,若要建立資料夾中所有圖片檔的清單,可以這樣撰寫:
import os
# 取得圖片檔案
folder_path = "images"
image_files = [f for f in os.listdir(folder_path) if f.endswith((".png", ".jpg", ".jpeg"))]
print("圖片檔案清單:")
print(image_files)
這種方法的優點
語法簡單、易於理解。
僅需使用 Python 標準函式庫即可實作。
非常適合用於小型資料夾的檔案操作。
注意事項
若資料夾中包含隱藏檔或特殊名稱的檔案,建議依需求進行過濾處理。
若應用於大型目錄,可能會對效能造成影響。
3. 善用 glob 模組進行萬用字元搜尋
使用 Python 的 glob 模組,可以有效取得符合特定模式的檔案名稱。與 os 模組不同的是,glob 可以利用萬用字元靈活設定檔案搜尋條件,功能更強大。
from pathlib import Path
# 取得資料夾中的所有檔案
folder_path = Path("sample_folder")
files = [f for f in folder_path.iterdir() if f.is_file()]
print("資料夾中的檔案:")
print(files)
這段程式碼會排除子資料夾,只保留檔案。
依副檔名過濾
若想取得特定副檔名的檔案,只需加上條件即可。
from pathlib import Path
# 取得所有 .txt 檔案
folder_path = Path("sample_folder")
text_files = [f for f in folder_path.iterdir() if f.is_file() and f.suffix == ".txt"]
print("文字檔案:")
print(text_files)
在取得資料夾內檔案時,有時也需要包含子資料夾內的檔案進行遞迴式取得。本節將介紹如何使用 os 模組及其他方法,來達成這樣的操作。
使用 os.walk() 的方法
os.walk() 會遞迴探索指定資料夾及其子資料夾,並取得資料夾名稱、子資料夾名稱與檔案名稱。
import os
# 取得子資料夾中所有檔案
folder_path = "sample_folder"
for root, dirs, files in os.walk(folder_path):
for file in files:
print(f"檔案: {os.path.join(root, file)}")
程式碼說明:
os.walk() 會回傳一個包含 (資料夾路徑, 子資料夾清單, 檔案清單) 的 tuple。
使用 os.path.join() 組合出完整檔案路徑。
將檔案清單存入列表中
如果想將取得的檔案名稱統一存入列表中,可以這樣撰寫:
import os
# 將子資料夾中的所有檔案存入列表
folder_path = "sample_folder"
all_files = []
for root, dirs, files in os.walk(folder_path):
for file in files:
all_files.append(os.path.join(root, file))
print("子資料夾內所有檔案:")
print(all_files)
僅取得特定副檔名的檔案
例如,如果只想取得 .txt 檔案,可以加上條件:
import os
# 取得子資料夾內的 .txt 檔案
folder_path = "sample_folder"
txt_files = []
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith(".txt"):
txt_files.append(os.path.join(root, file))
print("文字檔案:")
print(txt_files)
import os
# 取得指定副檔名的檔案
folder_path = "sample_folder"
txt_files = [f for f in os.listdir(folder_path) if f.endswith(".txt")]
print("文字檔案:")
print(txt_files)
範例:使用 pathlib 模組 使用 pathlib 模組可讓副檔名過濾更加簡潔:
from pathlib import Path
# 取得 .txt 副檔名的檔案
folder_path = Path("sample_folder")
txt_files = [f for f in folder_path.iterdir() if f.suffix == ".txt"]
print("文字檔案:")
print(txt_files)
檔名包含特定字串時的過濾
要判斷檔案名稱是否包含特定字串,可以使用 in 運算子:
import os
# 取得檔名中包含 "report" 的檔案
folder_path = "sample_folder"
report_files = [f for f in os.listdir(folder_path) if "report" in f]
print("包含 report 的檔案:")
print(report_files)
使用正規表示式進行進階過濾
若要更靈活地比對檔案名稱,可使用 re 模組的正規表示式:
import os
import re
# 取得僅由數字組成的檔案名稱
folder_path = "sample_folder"
pattern = re.compile(r"^\d+$")
files = [f for f in os.listdir(folder_path) if pattern.match(f)]
print("僅由數字組成的檔案:")
print(files)
依檔案大小過濾
若想根據檔案大小篩選,例如大於 1MB 的檔案:
import os
# 取得大於 1MB 的檔案
folder_path = "sample_folder"
large_files = [f for f in os.listdir(folder_path) if os.path.getsize(os.path.join(folder_path, f)) > 1 * 1024 * 1024]
print("1MB 以上的檔案:")
print(large_files)
應用範例
1. 按副檔名分類 若要將檔案依副檔名分類,可使用字典:
import os
# 根據副檔名分類檔案
folder_path = "sample_folder"
files_by_extension = {}
for f in os.listdir(folder_path):
ext = os.path.splitext(f)[1] # 取得副檔名
if ext not in files_by_extension:
files_by_extension[ext] = []
files_by_extension[ext].append(f)
print("按副檔名分類結果:")
print(files_by_extension)
2. 依修改時間篩選 要依檔案的更新時間過濾,可以使用 os.path.getmtime():
import os
import time
# 取得一週內有更新的檔案
folder_path = "sample_folder"
one_week_ago = time.time() - 7 * 24 * 60 * 60
recent_files = [f for f in os.listdir(folder_path) if os.path.getmtime(os.path.join(folder_path, f)) > one_week_ago]
print("最近更新的檔案:")
print(recent_files)
各種過濾方法的應用與比較
過濾條件
使用方式
應用場景
副檔名
f.endswith(".txt")
按檔案類型分類
特定字串
"keyword" in f
搜尋特定用途的檔案
正規表示式
re.match(pattern, f)
比對複雜命名模式
檔案大小
os.path.getsize()
偵測大型檔案
更新時間
os.path.getmtime()
找出最近使用的檔案
7. 實務範例:如何活用取得的檔案名稱清單
取得的檔案名稱清單可以依據不同需求廣泛應用。本節將介紹幾個常見的應用情境與對應的程式碼範例。
批次處理檔案內容
以下是使用檔案清單來批次讀取文字檔內容的範例: 範例:讀取所有文字檔的內容
import os
# 取得資料夾中的文字檔案
folder_path = "sample_folder"
text_files = [f for f in os.listdir(folder_path) if f.endswith(".txt")]
# 批次讀取檔案內容
all_content = ""
for file in text_files:
with open(os.path.join(folder_path, file), "r", encoding="utf-8") as f:
all_content += f.read() + "\n"
print("所有文字檔案的內容:")
print(all_content)
重新命名檔案
透過檔案名稱清單,可以一次性重新命名多個檔案: 範例:為檔案名稱加上前綴詞
import os
# 取得資料夾內所有檔案
folder_path = "sample_folder"
files = os.listdir(folder_path)
# 加上前綴詞
for file in files:
old_path = os.path.join(folder_path, file)
new_path = os.path.join(folder_path, f"new_{file}")
os.rename(old_path, new_path)
print("已重新命名檔案。")
儲存檔案名稱清單
將檔案名稱清單儲存為文字檔或 CSV,可用來後續查閱: 範例:將清單寫入文字檔
import os
# 取得資料夾中的檔案
folder_path = "sample_folder"
files = os.listdir(folder_path)
# 寫入文字檔
with open("file_list.txt", "w", encoding="utf-8") as f:
for file in files:
f.write(file + "\n")
print("已儲存檔案名稱清單至文字檔。")
範例:將清單寫入 CSV 檔
import os
import csv
# 取得資料夾中的檔案
folder_path = "sample_folder"
files = os.listdir(folder_path)
# 寫入 CSV 檔
with open("file_list.csv", "w", encoding="utf-8", newline="") as csvfile:
writer = csv.writer(csvfile)
writer.writerow(["檔案名稱"]) # 加入欄位名稱
for file in files:
writer.writerow([file])
print("已儲存檔案名稱清單至 CSV。")
建立備份
使用檔案清單可方便將指定檔案備份至其他資料夾:
import os
import shutil
# 取得來源資料夾中的檔案
source_folder = "sample_folder"
backup_folder = "backup_folder"
os.makedirs(backup_folder, exist_ok=True)
files = os.listdir(source_folder)
# 複製檔案至備份資料夾
for file in files:
shutil.copy(os.path.join(source_folder, file), os.path.join(backup_folder, file))
print("已建立備份。")
限制處理特定檔案
可根據檔案清單,僅針對特定類型進行操作: 範例:刪除特定副檔名的檔案
import os
# 刪除所有 .tmp 檔案
folder_path = "sample_folder"
files = [f for f in os.listdir(folder_path) if f.endswith(".tmp")]
for file in files:
os.remove(os.path.join(folder_path, file))
print("已刪除不必要的檔案。")
import os
def get_files(folder_path):
for root, _, files in os.walk(folder_path):
for file in files:
yield os.path.join(root, file)
folder_path = "sample_folder"
for file in get_files(folder_path):
print(f"處理中: {file}")
錯誤 6:檔案被鎖定
發生情境: 檔案被其他應用程式使用中,無法修改或刪除。 解決方式:
找出正在使用該檔案的程式並關閉。
等待檔案釋放後再操作。
錯誤 7:UnicodeDecodeError
發生情境: 當檔案的編碼不明確時,會發生此錯誤。 解決方式:
明確指定編碼格式。
使用 chardet 套件檢測編碼。
import os
file_path = "sample_folder/sample_file.txt"
try:
with open(file_path, "r", encoding="utf-8") as f:
content = f.read()
print(content)
except UnicodeDecodeError:
print(f"錯誤:無法判斷檔案的編碼格式 ({file_path})")