python 周遊目錄或檔案
如果想得到某個目錄下面的所有檔案名,用 python 怎麼做?
先看代碼:
import os,sys
def explore(dir):
for root, dirs, files in os.walk(dir):
print('debug: ', root, dirs, files) # 這行用來調試,幫助了解代碼
for file in files:
path = os.path.join(root, file)
print(path)
def main():
for path in sys.argv[1:]:
if os.path.isdir(path):
explore(path)
if __name__ == "__main__":
main()
假設上面的代碼儲存為檔案 get_dirs.py
我們實操一下。
目前目錄結構如下:
$ tree
.
├── a
│ └── a1
│ └── a11
├── a.txt
├── b
├── b.txt
├── c.txt
├── get_dirs.py
└── ss
└── s.txt
結果是:
$ python3 get_dirs.py ./
debug: ./ ['a', 'b', 'ss'] ['a.txt', 'b.txt', 'c.txt', 'get_dirs.py']
./a.txt
./b.txt
./c.txt
./get_dirs.py
debug: ./a ['a1'] []
debug: ./a/a1 ['a11'] []
debug: ./a/a1/a11 [] []
debug: ./b [] []
debug: ./ss [] ['s.txt']
./ss/s.txt
代碼解讀如下。
for root, dirs, files in os.walk(dir):
print('debug: ', root, dirs, files) # 這行用來調試,幫助了解代碼
for file in files:
path = os.path.join(root, file)
print(path)
第 1 行的 os.walk 的函數聲明為:
walk(top, topdown=True, onerror=None, followlinks=False)
參數:
- top 是你所要便利的目錄的位址
- topdown 為真,則優先周遊 top 目錄,否則優先周遊 top 的子目錄(預設為真)
- onerror 需要一個 callable 對象,當 walk 需要異常時,會調用
- followlinks 如果為真,則會周遊目錄下的快捷方式(linux 下是 symbolic link)實際所指的目錄(預設為假)
os.walk 的傳回值是一個生成器(generator),也就是說我們需要不斷地周遊它,以獲得所有内容。
可以了解為 os.walk 會周遊所有的目錄(不包括檔案),每次周遊都會傳回一個三元組:(root,dirs,files)。
- root 表示目前正在周遊的目錄
- dirs 是一個 list ,會列出 root 下所有的目錄(不包括子目錄)
- files 也是一個 list , 會列出 root 下所有的檔案(不包括子目錄裡的檔案)
知道了這些,你再對比上面的列印結果就會豁然開朗。
代碼第 4 行,
path = os.path.join(root, file)
這句是什麼意思呢?其實就是把 root 和 file 拼接到一起,組成完整的檔案名。
舉個例子就明白了。
>>> import os
>>> os.getcwd()
'/mnt/hgfs/vm_share/grep_test'
>>> my_path = os.path.join(os.getcwd(), "hello")
>>> print(my_path)
/mnt/hgfs/vm_share/grep_test/hello
參考資料
【1】python中os.walk的用法
【2】os.path.join()用法