Python os.walk() 簡介

os.walk目錄遍歷<a id="sec-1" name="sec-1"></a>

每個月都有那么幾天想劃水,又到劃水的日子了,今天分享的是剛在處理遍歷目錄相關用到的相關方法。

os.walk<a id="sec-1-1" name="sec-1-1"></a>

os.walk的參數如下:

os.walk(top, topdown=True, onerror=None, followlinks=False)

其中:

  • top是要遍歷的目錄。
  • topdown是代表要從上而下遍歷還是從下往上遍歷。
  • onerror可以用來設置當便利出現錯誤的處理函數(該函數接受一個OSError的實例作為參數),設置為空則不作處理。
  • followlinks表示是否要跟隨目錄下的鏈接去繼續遍歷,要注意的是,os.walk不會記錄已經遍歷的目錄,所以跟隨鏈接遍歷的話有可能一直循環調用下去。

os.walk返回的是一個3個元素的元組 (root, dirs, files) ,分別表示遍歷的路徑名,該路徑下的目錄列表和該路徑下文件列表。注意目錄列表和文件列表不是具體路徑,需要具體路徑(從root開始的路徑)的話可以用 os.path.join(root,dir)os.path.join(root,dir)

例子<a id="sec-1-2" name="sec-1-2"></a>

假設現在存在如下的文件和目錄結構:

?  test_os_walk git:(master) ? tree
.
├── a.py
├── b.py
├── c.py
├── dir1
│   ├── dir4
│   │   ├── g.py
│   │   └── h.py
│   ├── dirx
│   │   ├── diry
│   │   │   └── k.py
│   │   └── z.py
│   ├── e.py
│   ├── f.py
│   └── g.py
├── dir2
│   ├── dira
│   │   └── dirb
│   │       └── dirc
│   │           └── aha.py
│   ├── k.py
│   ├── l.py
│   └── m.py
└── dir3
    ├── dir5
    │   └── z.py
    ├── x.py
    └── y.py

10 directories, 17 files

測試topdown<a id="sec-1-2-1" name="sec-1-2-1"></a>

當我用 os.walk 遍歷這個目錄時,程序和輸出如下:

import os

path = '/Users/nisen/Projects/python_advanced_class/test/test_os_walk'

for root, dirs, files in os.walk(path, True):
    print 'root: %s' % root
    print 'dirs: %s' % dirs
    print 'files: %s' % files
    print ''

結果如下,從root的路徑可以看出遍歷是自上而下的:

?  test git:(master) ? python test11.py
root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk
dirs: ['dir1', 'dir2', 'dir3']
files: ['a.py', 'b.py', 'c.py']

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1
dirs: ['dir4', 'dirx']
files: ['e.py', 'f.py', 'g.py']

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dir4
dirs: []
files: ['g.py', 'h.py']

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dirx
dirs: ['diry']
files: ['z.py']

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dirx/diry
dirs: []
files: ['k.py']

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2
dirs: ['dira']
files: ['k.py', 'l.py', 'm.py']

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira
dirs: ['dirb']
files: []

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira/dirb
dirs: ['dirc']
files: []

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira/dirb/dirc
dirs: []
files: ['aha.py']

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir3
dirs: ['dir5']
files: ['x.py', 'y.py']

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir3/dir5
dirs: []
files: ['z.py']

而當設置os.walk的topdown為False時,結果如下, 可以看出他是自上而下遍歷的:

?  test git:(master) ? python test11.py
root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dir4
dirs: []
files: ['g.py', 'h.py']

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dirx/diry
dirs: []
files: ['k.py']

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dirx
dirs: ['diry']
files: ['z.py']

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1
dirs: ['dir4', 'dirx']
files: ['e.py', 'f.py', 'g.py']

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira/dirb/dirc
dirs: []
files: ['aha.py']

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira/dirb
dirs: ['dirc']
files: []

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira
dirs: ['dirb']
files: []

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2
dirs: ['dira']
files: ['k.py', 'l.py', 'm.py']

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir3/dir5
dirs: []
files: ['z.py']

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir3
dirs: ['dir5']
files: ['x.py', 'y.py']

root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk
dirs: ['dir1', 'dir2', 'dir3']
files: ['a.py', 'b.py', 'c.py']

運行時修改遍歷目錄<a id="sec-1-2-2" name="sec-1-2-2"></a>

當topdown設置為True時,可以在處理時修改返回的 dirs 列表,這樣可以遍歷下面的目錄時會根據修改后的 dirs 來遍歷。比如下面的例子,在遍歷的時候不把"CSV"目錄包括在內:

import os
from os.path import join, getsize
for root, dirs, files in os.walk('python/Lib/email'):
    print root, "consumes",
    print sum(getsize(join(root, name)) for name in files),
    print "bytes in", len(files), "non-directory files"
    if 'CVS' in dirs:
        dirs.remove('CVS')  # don't visit CVS directories

參考資料<a id="sec-2" name="sec-2"></a>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • os.walk() 函數聲明:walk(top,topdown=True,onerror=None) 1>參數to...
    mugtmag閱讀 4,038評論 0 0
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • os模塊 os模塊的作用: os,語義為操作系統,所以肯定就是操作系統相關的功能了,可以處理文件和目錄這些我們日常...
    Irlans閱讀 619評論 0 2
  • Ubuntu的發音 Ubuntu,源于非洲祖魯人和科薩人的語言,發作 oo-boon-too 的音。了解發音是有意...
    螢火蟲de夢閱讀 99,560評論 9 467
  • 這一篇博客是繼上一篇博客,想了解的可以直走右拐。 上一篇主要講了客戶端的界面,這一篇主要講解FTP客戶端的兩個功能...
    小奚有話說閱讀 1,223評論 0 1