1. 前言
使用 Python 來取得資料夾中的檔案名稱,是對於程式設計新手到中階使用者都非常實用的技能。透過檔案名稱的取得,可以有效提升大量資料的處理與檔案操作效率,對於工作自動化與資料整理都非常有幫助。
本文將一步步說明如何使用 Python 來取得資料夾中的檔案名稱。為了讓初學者也能輕鬆實作,會搭配程式碼範例進行詳細解說。
2. 使用 os 模組取得基本的檔案名稱
透過 Python 的標準函式庫 os
模組,可以輕鬆取得資料夾中的檔案名稱。這種方式非常適合第一次使用 Python 的人,具有簡潔直觀的程式碼結構。
os.listdir() 函式的基本用法
os.listdir()
會將指定資料夾中的所有項目(包含檔案與資料夾)以列表形式傳回。
import os
# 取得資料夾中的檔案與子資料夾
folder_path = "sample_folder"
items = os.listdir(folder_path)
print("資料夾中的項目:")
print(items)
執行上述程式碼後,會以列表形式顯示指定資料夾中的檔案與資料夾名稱。
僅擷取檔案名稱的方法
由 os.listdir()
取得的清單中可能會包含資料夾名稱。若要僅擷取檔案,可以使用 os.path.isfile()
進行過濾。
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
可以利用萬用字元靈活設定檔案搜尋條件,功能更強大。
glob 模組的基本用法
透過 glob.glob()
,可以取得符合指定模式的檔案或資料夾路徑。
import glob
# 取得資料夾中的所有檔案
folder_path = "sample_folder"
files = glob.glob(f"{folder_path}/*")
print("資料夾中的檔案:")
print(files)
這段程式碼會取得指定資料夾中所有項目的路徑(包含檔案與子資料夾)。
取得符合特定模式的檔案
例如,若只想取得特定副檔名的檔案,可使用以下寫法:
import glob
# 取得指定副檔名的檔案
folder_path = "sample_folder"
text_files = glob.glob(f"{folder_path}/*.txt")
print("文字檔案清單:")
print(text_files)
上述範例會取得所有副檔名為 .txt
的檔案。如果要指定多個副檔名,也可以這樣寫:
import glob
# 同時取得 .txt 與 .csv 檔案
folder_path = "sample_folder"
files = glob.glob(f"{folder_path}/*.txt") + glob.glob(f"{folder_path}/*.csv")
print("文字與CSV檔案清單:")
print(files)
遞迴取得檔案
使用 glob
模組的 recursive=True
參數,可同時取得子資料夾中的檔案。
import glob
# 遞迴取得子資料夾中的所有檔案
folder_path = "sample_folder"
files = glob.glob(f"{folder_path}/**/*", recursive=True)
print("子資料夾內所有檔案:")
print(files)
萬用字元的使用範例
*
:代表任意長度的字串?
:代表任意一個字元[abc]
:代表括號內任一字元
import glob
# 取得以 "data" 開頭的所有檔案
folder_path = "sample_folder"
files = glob.glob(f"{folder_path}/data*")
print("以 data 開頭的檔案清單:")
print(files)
優點與應用場景
- 可以靈活指定搜尋條件,特別適合檔案名稱的模式比對。
- 相比
os
模組,程式碼更簡潔。 - 支援遞迴搜尋,操作方便。
注意事項
- 若沒有找到符合模式的檔案,會回傳空清單,請記得檢查結果。
- 使用遞迴搜尋時,可能會取得過多檔案,建議搭配條件過濾使用。

4. 使用 pathlib 模組以物件導向方式操作
Python 的 pathlib
模組是一種現代化且直觀的方式,用於以物件導向方式處理檔案路徑操作。它不僅能提高程式的可讀性,也能簡化操作流程。
pathlib 模組的基本用法
使用 Path
物件,可以簡單地取得資料夾中的項目。
from pathlib import Path
# 取得資料夾中的項目
folder_path = Path("sample_folder")
items = list(folder_path.iterdir())
print("資料夾中的項目:")
print(items)
上述程式碼會將資料夾中的所有項目(檔案與子資料夾)以 Path
物件列表形式傳回。
僅取得檔案名稱
若要從中僅取得檔案,可使用 is_file()
方法進行判斷。
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)
透過 suffix
屬性,可以簡單取得檔案的副檔名。
遞迴取得檔案
若要包含子資料夾內的檔案,可使用 rglob()
方法。
from pathlib import Path
# 遞迴取得所有檔案
folder_path = Path("sample_folder")
files = list(folder_path.rglob("*"))
print("子資料夾內的所有檔案:")
print(files)
此外,也能針對特定副檔名進行遞迴搜尋:
from pathlib import Path
# 遞迴取得所有 .txt 檔案
folder_path = Path("sample_folder")
text_files = list(folder_path.rglob("*.txt"))
print("遞迴取得的文字檔案:")
print(text_files)
優點與應用場景
- 可以使用物件導向方式撰寫更直觀的程式碼。
- 支援遞迴與條件過濾,操作簡單。
- 自 Python 3.4 起內建,為現代 Python 推薦的寫法。
注意事項
- 無法在 Python 3.4 以下版本使用。
- 操作大型資料夾時需注意效能。

5. 遞迴取得子資料夾中的檔案
在取得資料夾內檔案時,有時也需要包含子資料夾內的檔案進行遞迴式取得。本節將介紹如何使用 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)
使用 glob 模組的遞迴搜尋
使用 glob
模組的 **
通配符,可輕鬆實現遞迴搜尋。
import glob
# 遞迴取得所有檔案
folder_path = "sample_folder"
all_files = glob.glob(f"{folder_path}/**/*", recursive=True)
print("遞迴取得的檔案:")
print(all_files)
如果只想取得特定副檔名的檔案,也非常容易:
import glob
# 遞迴取得所有 .txt 檔案
folder_path = "sample_folder"
txt_files = glob.glob(f"{folder_path}/**/*.txt", recursive=True)
print("遞迴取得的文字檔案:")
print(txt_files)
使用 pathlib 模組的遞迴取得
pathlib
模組的 rglob()
方法,也可以非常直觀地實現遞迴搜尋。
from pathlib import Path
# 遞迴取得所有檔案
folder_path = Path("sample_folder")
all_files = list(folder_path.rglob("*"))
print("遞迴取得的檔案:")
print(all_files)
指定副檔名也同樣簡單:
from pathlib import Path
# 遞迴取得 .txt 檔案
folder_path = Path("sample_folder")
txt_files = list(folder_path.rglob("*.txt"))
print("遞迴取得的文字檔案:")
print(txt_files)
各種方法的比較
方法 | 特性 | 優點 | 注意事項 |
---|---|---|---|
os.walk() | 手動實作遞迴式檔案搜尋 | 彈性高,可自定處理邏輯 | 程式碼稍長 |
glob | 支援萬用字元,語法簡潔 | 能用短程式碼實現遞迴搜尋 | 需要設計搜尋模式 |
pathlib.rglob() | 物件導向,語法現代且簡潔 | 可讀性高,符合新式 Python 開發 | 僅支援 Python 3.4 以上 |

6. 根據特定條件進行檔案名稱過濾與應用範例
依照特定條件過濾檔案,可幫助整理取得的檔案清單,並依據需求進行資料處理。本節將介紹如何透過 Python 過濾副檔名、檔名,甚至使用正規表示式來精準篩選檔案。
依副檔名過濾
若只需取得特定副檔名的檔案,可使用條件式或列表推導式:
範例:使用 os 模組
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("已刪除不必要的檔案。")
延伸應用情境
- 資料收集:統整多個 CSV 檔案資料。
- 日誌管理:找出舊的 log 檔並刪除。
- 影像處理:對指定資料夾內圖片進行批次縮圖或格式轉換。

8. 疑難排解:常見錯誤與解決方式
在進行檔案處理或取得檔案名稱時,可能會遇到各種錯誤。本節說明常見錯誤與對應解決方式。
錯誤 1:找不到資料夾
發生情境:
指定的資料夾不存在時,會出現 FileNotFoundError
。
可能原因:
- 路徑拼錯或不存在。
- 資料夾已被刪除。
解決方式:
- 使用
os.path.exists()
或pathlib.Path.exists()
檢查是否存在。
import os
folder_path = "sample_folder"
if not os.path.exists(folder_path):
print(f"錯誤:找不到資料夾 ({folder_path})")
else:
print("資料夾存在。")
錯誤 2:權限錯誤
發生情境:
嘗試讀取或寫入檔案時,發生 PermissionError
。
可能原因:
- 沒有該檔案的存取權限。
- 檔案被其他程式鎖定中。
解決方式:
- 確認檔案權限並修改。
- 確保檔案未被其他程式使用。
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 PermissionError:
print(f"錯誤:無法存取檔案 ({file_path})")
錯誤 3:路徑過長
發生情境:
在 Windows 上,路徑超過 260 個字元可能導致錯誤。
解決方式:
- 啟用 Windows 支援長路徑的設定。
- 簡化檔案或資料夾名稱。
import os
# 簡化路徑
long_path = "a/very/long/path/to/a/folder/with/a/long/file_name.txt"
short_path = os.path.basename(long_path)
print(f"簡化後的路徑: {short_path}")
錯誤 4:特殊字元導致問題
發生情境:
檔名包含空格、特殊符號或非 ASCII 字元時,可能會出錯。
解決方式:
- 正規化檔名。
- 移除或取代非 ASCII 字元。
import os
file_path = "sample_folder/サンプル file!.txt"
normalized_file_path = file_path.replace(" ", "_").replace("!", "")
print(f"正規化後的檔名: {normalized_file_path}")
錯誤 5:記憶體不足
發生情境:
處理大型目錄時,可能出現記憶體不足錯誤。
解決方式:
- 分批處理檔案。
- 使用生成器(generator)避免一次載入所有資料。
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})")
總結
這些錯誤處理方法能幫助你更順利進行檔案操作,提升程式的穩定性與可靠性。

9. 總結
本文從基礎到進階,完整介紹了如何使用 Python 取得資料夾中的檔案名稱。以下是各種方法的特色與適用情境整理。
各種方法的特性與使用時機
方法 | 特性 | 適用情境 |
---|---|---|
os 模組 | – 為標準函式庫的一部分,使用簡單。 | 適用於小型資料夾或基本檔案操作。 |
– 遞迴操作時可使用 os.walk() 。 | 需遍歷子資料夾時。 | |
glob 模組 | – 可使用萬用字元進行模式搜尋。 | 條件搜尋副檔名或名稱時特別方便。 |
– 使用 recursive=True 即可遞迴搜尋。 | 搜尋子資料夾中特定檔案。 | |
pathlib 模組 | – 提供物件導向的現代語法。 | 適合使用 Python 3.4 以上,重視可讀性時。 |
– rglob() 可直覺地實現遞迴搜尋。 | 希望簡潔描述整個資料夾結構時。 |
應用案例回顧
- 建立檔案清單:使用
os
或glob
列出所有檔案。 - 條件過濾:透過副檔名、關鍵字、正規表示式篩選所需檔案。
- 批次處理:用清單來讀寫內容,提高效率。
- 進階操作:如重新命名、備份或刪除不需要的檔案。
錯誤處理的重要性
進行檔案操作時,應留意以下幾點以提升程式穩定性:
- 事先檢查檔案與資料夾是否存在。
- 處理權限、特殊字元等問題。
- 針對大量檔案注意效能與記憶體。
掌握 Python 檔案名稱處理的優勢
使用 Python 取得檔案名稱的技巧,可應用於多種情境,具備以下優勢:
- 提升效率:自動化例行作業與資料整理。
- 高度彈性:依條件靈活處理檔案。
- 可擴充性:可應對小型至大型資料集。
結語
Python 提供了多種模組與工具來進行檔案操作。適當運用 os
、glob
、pathlib
等模組,可大幅提升檔案處理的效率與精確度。
希望本文能幫助初學者至中階使用者,提升 Python 檔案處理的能力,並能實際應用在專案或日常工作中,體驗 Python 的便利性!