這裡介紹如何在 Python 中列出目錄中的檔案,並且配合各種篩選方式,取得符合條件的檔案列表。

在使用 Python 開發處理檔案的程式時,時常會需要把一個目錄中的檔案名稱全部列出來,然後再使用迴圈對每一個檔案進行後續的處理,以下是各種取得目錄中所有檔案名稱的方法與範例程式碼。

os.listdir 取得檔案列表

os.listdir 可以取得指定目錄中所有的檔案與子目錄名稱,以下是一個簡單的範例:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from os import listdir
from os.path import isfile, isdir, join

# 指定要列出所有檔案的目錄
mypath = "/var/log"

# 取得所有檔案與子目錄名稱
files = listdir(mypath)

# 以迴圈處理
for f in files:
  # 產生檔案的絕對路徑
  fullpath = join(mypath, f)
  # 判斷 fullpath 是檔案還是目錄
  if isfile(fullpath):
    print("檔案:", f)
  elif isdir(fullpath):
    print("目錄:", f)

這個例子中我們使用 os.listdir 取得 /var/log 目錄中所有的檔案與子目錄的列表,接著使用一個迴圈來檢查每個項目是檔案還是目錄,在迴圈中我們先用 os.path.join 把檔名加上目錄的路徑,產生檔案的絕對路徑後,再以 os.path.isfileos.path.isdir 來判斷該項目是普通檔案還是目錄。

執行之後,輸出會類似這樣:

目錄: lightdm
目錄: ntpstats
檔案: Xorg.0.log
檔案: messages
檔案: bootstrap.log
[略]

os.walk 遞迴搜尋檔案

os.walk 是一個以遞迴方式列出特定路徑下,所有子目錄與檔案的函數,以下是一個使用範例:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from os import walk

# 指定要列出所有檔案的目錄
mypath = "/var/log"

# 遞迴列出所有子目錄與檔案
for root, dirs, files in walk(mypath):
  print("路徑:", root)
  print("  目錄:", dirs)
  print("  檔案:", files)

os.walk 會自動遞迴搜尋指定路徑之下的所有子目錄,將每一個目錄中的檔案都列出來,並且自動區分檔案與目錄,執行之後輸出會類似這樣:

路徑: /var/log
  目錄: ['lightdm', 'ntpstats', 'apt', 'fsck', 'samba']
  檔案: ['Xorg.0.log', 'messages', 'bootstrap.log', 'dpkg.log', 'kern.log', 'faillog', 'syslog', 'btmp', 'user.log', 'alternatives.log', 'wtmp', 'auth.log', 'fontconfig.log', 'daemon.log', 'Xorg.0.log.old', 'debug', 'lastlog', 'dmesg', 'boot.log']
路徑: /var/log/ntpstats
  目錄: []
  檔案: []
路徑: /var/log/apt
  目錄: []
  檔案: ['term.log', 'history.log']
[略]

若要取得所有檔案的絕對路徑,讓程式逐一處理的話,可以這樣寫:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from os import walk
from os.path import join

# 指定要列出所有檔案的目錄
mypath = "/var/log"

# 遞迴列出所有檔案的絕對路徑
for root, dirs, files in walk(mypath):
  for f in files:
    fullpath = join(root, f)
    print(fullpath)

這樣執行後,不管該路徑之下有多少層子目錄,都會自動列出所有的檔案路徑,輸出會類似這樣:

/var/log/Xorg.0.log
/var/log/messages
/var/log/bootstrap.log
[略]
/var/log/boot.log
/var/log/apt/term.log
/var/log/apt/history.log
/var/log/fsck/checkfs
/var/log/fsck/checkroot

參考資料:StackOverflow