這裡介紹如何在 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.isfile
與 os.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