必掌握的技巧之一
- 2020 年 3 月 18 日
- 筆記
1196字 | 3分鐘閱讀
獲取文件夾中的文件列表
問題核心:★★★★ 口感:苦瓜
問題
想獲取文件系統中某個目錄下的所有文件列表。
解決方案
使用 os.listdir() 函數來獲取某個目錄中的文件列表:
import os names = os.listdir('somedir')
結果會返回目錄中所有文件列表,包括所有文件,子目錄,符號鏈接等等。如果你需要通過某種方式過濾數據,可以考慮結合 os.path 庫中的一些函數來使用列表推導。
比如:
import os.path names = [name for name in os.listdir('somedir') if os.path.isfile(os.path.join('somedir', name))] dirnames = [name for name in os.listdir('somedir') if os.path.isdir(os.path.join('somedir', name))]
字元串的 startswith() 和 endswith() 方法對於過濾一個目錄的內容也是很有用 的。
比如:
pyfiles = [name for name in os.listdir('somedir') if name.endswith('.py')]
對於文件名的匹配,你可能會考慮使用 glob 或 fnmatch 模組。
比如:
import glob pyfiles = glob.glob('somedir/*.py') from fnmatch import fnmatch pyfiles = [name for name in os.listdir('somedir') if fnmatch(name, '*.py')]
結論
獲取目錄中的列表是很容易的,但是其返回結果只是目錄中實體名列表而已。如果你還想獲取其他的元資訊,比如文件大小,修改時間等等,你或許還需要使用到 os.path 模組中的函數或著 os.stat() 函數來收集數據。
比如:
import os import os.path import glob pyfiles = glob.glob('*.py') name_sz_date = [(name, os.path.getsize(name), os.path.getmtime(name)) for name in pyfiles] for name, size, mtime in name_sz_date: print(name, size, mtime) file_metadata = [(name, os.stat(name)) for name in pyfiles] for name, meta in file_metadata: print(name, meta.st_size, meta.st_mtime)
最後還有一點要注意的就是,有時候在處理文件名編碼問題時候可能會出現一些 問題。通常來講,函數 os.listdir() 返回的實體列表會根據系統默認的文件名編碼來 解碼。但是有時候也會碰到一些不能正常解碼的文件名。
-END-