天天看點

python 周遊目錄或檔案python 周遊目錄或檔案

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()用法