使用 Python 取得資料夾中的檔案名稱方法|新手也能看懂的完整指南

目次

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 標準函式庫即可實作。
  • 非常適合用於小型資料夾的檔案操作。

注意事項

  • 若資料夾中包含隱藏檔或特殊名稱的檔案,建議依需求進行過濾處理。
  • 若應用於大型目錄,可能會對效能造成影響。

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

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()找出最近使用的檔案

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

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() 可直覺地實現遞迴搜尋。希望簡潔描述整個資料夾結構時。

應用案例回顧

  • 建立檔案清單:使用 osglob 列出所有檔案。
  • 條件過濾:透過副檔名、關鍵字、正規表示式篩選所需檔案。
  • 批次處理:用清單來讀寫內容,提高效率。
  • 進階操作:如重新命名、備份或刪除不需要的檔案。

錯誤處理的重要性

進行檔案操作時,應留意以下幾點以提升程式穩定性:

  • 事先檢查檔案與資料夾是否存在。
  • 處理權限、特殊字元等問題。
  • 針對大量檔案注意效能與記憶體。

掌握 Python 檔案名稱處理的優勢

使用 Python 取得檔案名稱的技巧,可應用於多種情境,具備以下優勢:

  1. 提升效率:自動化例行作業與資料整理。
  2. 高度彈性:依條件靈活處理檔案。
  3. 可擴充性:可應對小型至大型資料集。

結語

Python 提供了多種模組與工具來進行檔案操作。適當運用 osglobpathlib 等模組,可大幅提升檔案處理的效率與精確度。

希望本文能幫助初學者至中階使用者,提升 Python 檔案處理的能力,並能實際應用在專案或日常工作中,體驗 Python 的便利性!