python中os.walk的用法

python中os.walk是一個(gè)簡單易用的文件、目錄遍歷器,可以幫助我們高效的處理文件、目錄方面的事情。

1.載入
要使用os.walk,首先要載入該函數(shù)

可以使用以下兩種方法

  • import os
  • from os import walk

2.使用

os.walk的函數(shù)聲明為:

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

參數(shù)

  • top 是你所要便利的目錄的地址
  • topdown 為真,則優(yōu)先遍歷top目錄,否則優(yōu)先遍歷top的子目錄(默認(rèn)為開啟)
  • onerror 需要一個(gè) callable 對象,當(dāng)walk需要異常時(shí),會(huì)調(diào)用
  • followlinks 如果為真,則會(huì)遍歷目錄下的快捷方式(linux 下是 symbolic link)實(shí)際所指的目錄(默認(rèn)關(guān)閉)

os.walk 的返回值是一個(gè)生成器(generator),也就是說我們需要不斷的遍歷它,來獲得所有的內(nèi)容。

每次遍歷的對象都是返回的是一個(gè)三元組(root,dirs,files)

  • root 所指的是當(dāng)前正在遍歷的這個(gè)文件夾的本身的地址
  • dirs 是一個(gè) list ,內(nèi)容是該文件夾中所有的目錄的名字(不包括子目錄)
  • files 同樣是 list , 內(nèi)容是該文件夾中所有的文件(不包括子目錄)

如果topdown 參數(shù)為真,walk 會(huì)遍歷top文件夾,與top文件夾中每一個(gè)子目錄。

舉個(gè)例子

如果我們有如下的文件結(jié)構(gòu):

      a ->   b   ->   1.txt,  2.txt
             c   ->   3.txt
             d   ->   
           4.txt
           5.txt
for (root, dirs, files) in os.walk('a'):
    #第一次運(yùn)行時(shí),當(dāng)前遍歷目錄為 a
    所以 root == 'a'
         dirs == [ 'b', 'c', 'd']
         files == [ '4.txt', '5.txt']
    
    。。。

    # 接著遍歷 dirs 中的每一個(gè)目錄
    b:  root  = 'a\\b'
        dirs  = []
        files = [ '1.txt', '2.txt']
    
    # dirs為空,返回
    # 遍歷c
    c:  root  = 'a\\c'
        dirs  = []
        files = [ '3.txt' ]
    
    PS : 如果想獲取文件的全路徑,只需要 
    for f in files:
        path = os.path.join(root,f)
    
    # 遍歷d
    d:  root  = 'a\\b'
        dirs  = []
        files = []

    遍歷完畢,退出循環(huán)

3.簡單的例子

保持目錄 a 的目錄結(jié)構(gòu),在 b 中創(chuàng)建對應(yīng)的文件夾,并把a(bǔ)中所有的文件加上后綴 _bak

import os

Root = 'a'
Dest = 'b'

for (root, dirs, files) in os.walk(Root):
    new_root = root.replace(Root, Dest, 1)
    if not os.path.exists(new_root):
        os.mkdir(new_root)
    
    for d in dirs:
        d = os.path.join(new_root, d)
        if not os.path.exists(d):
            os.mkdir(d)
    
    for f in files:
        # 把文件名分解為 文件名.擴(kuò)展名
        # 在這里可以添加一個(gè) filter,過濾掉不想復(fù)制的文件類型,或者文件名
        (shotname, extension) = os.path.splitext(f)
        # 原文件的路徑
        old_path = os.path.join(root, f)
        new_name = shotname + '_bak' + extension
        # 新文件的路徑
        new_path = os.path.join(new_root, new_name)
        try:
            # 復(fù)制文件
            open(new_path, 'wb').write(open(old_path, 'rb').read())
        except IOError as e:
            print(e)

by Q'Boy 2017-3-10 10:12:13

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容