必掌握的技巧之一

  • 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-