Python os.walk文件遍歷用法【轉】


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

1.載入
要使用os.walk,首先要載入該函數

可以使用以下兩種方法

  • import os
  • from os import walk

2.使用

os.walk的函數聲明為:

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

參數

  • top 是你所要便利的目錄的地址
  • topdown 為真,則優先遍歷top目錄,否則優先遍歷top的子目錄(默認為開啟)
  • onerror 需要一個 callable 對象,當walk需要異常時,會調用
  • followlinks 如果為真,則會遍歷目錄下的快捷方式(linux 下是 symbolic link)實際所指的目錄(默認關閉)

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

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

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

如果topdown 參數為真,walk 會遍歷top文件夾,與top文件夾中每一個子目錄。

舉個例子

如果我們有如下的文件結構:

      a ->   b   ->   1.txt,  2.txt
             c   ->   3.txt
             d   ->   
           4.txt
           5.txt

for (root, dirs, files) in os.walk('a'):
    #第一次運行時,當前遍歷目錄為 a
    所以 root == 'a'
         dirs == [ 'b', 'c', 'd']
         files == [ '4.txt', '5.txt']
    
    。。。

    # 接着遍歷 dirs 中的每一個目錄
    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 = []

    遍歷完畢,退出循環

 

3.簡單的例子

保持目錄 a 的目錄結構,在 b 中創建對應的文件夾,並把a中所有的文件加上后綴 _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:
        # 把文件名分解為 文件名.擴展名
        # 在這里可以添加一個 filter,過濾掉不想復制的文件類型,或者文件名
        (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:
            # 復制文件
            open(new_path, 'wb').write(open(old_path, 'rb').read())
        except IOError as e:
            print(e)

 

轉自
作者:MikuLovely
鏈接:https://www.jianshu.com/p/bbad16822eab
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。
 
#!/usr/bin/python
#coding=utf-8
import os
def dirlist(path):
    for root,dirs,files in os.walk(path):  #將os.walk在元素中提取的值,分別放到root(根目錄),dirs(目錄名),files(文件名)中。
        for file in files:
            print os.path.join(root,file)  #根目錄與文件名組合,形成絕對路徑。
if __name__=='__main__':
    path = '/test'
    dirlist(path)

 

執行結果:

知識點:

代碼中的root為str類型,dirs為list類型,files為list類型

當root為/test時,dirs列表中是/test下的目錄,files列表是/test下的文件

當root為/test/aa時,dirs列表則為/test/aa下的目錄,fiels列表是/test/aa下的文件

心得:

#!/usr/bin/python
import os,os.path
def visit(arg,dirname,names):
    for filespath in names:
        print os.path.join(dirname,filespath)
if __name__=='__main__':
    path = '/test'
    os.path.walk(path,visit,())


關於os.path.walk不清楚,暫且標記。

轉自

自學python之——os.walk 查找目錄下的文件 - CSDN博客 https://blog.csdn.net/happylife_haha/article/details/44566975

 

#!/usr/bin/python
# -*- coding: gbk -*-
  
# os.walk()的使用  
import os  
  
# 枚舉dirPath目錄下的所有文件  
  
def main():  
#begin  
    fileDir = "F:" + os.sep + "kams"     # 查找F:\aaa 目錄下    
    for root, dirs, files in os.walk(fileDir):  
    #begin  
        for dir in dirs:  
        #begin  
            print(os.path.join(root, dir))  
        #end  
        for file in files:  
        #begin  
            print(os.path.join(root, file))  
        #end  
    #end  
    os.system("pause")  
#end  
  
if __name__ == '__main__':  
#begin  
    main()  
#end

執行結果

目錄:
F:\kams\.svn F:\kams\war119 F:\kams\war120
文件: F:\kams\.svn\pristine F:\kams\.svn\tmp F:\kams\.svn\entries F:\kams\.svn\format F:\kams\.svn\wc.db F:\kams\.svn\wc.db
-journal F:\kams\.svn\pristine\12 F:\kams\.svn\pristine\96 F:\kams\.svn\pristine\9a F:\kams\.svn\pristine\12\12b99bf8ef5342805dab3cb5da02650ea50d7994.svn-base F:\kams\.svn\pristine\96\96c5938bf3f1c89e3da195fc7839744a8b01822a.svn-base F:\kams\.svn\pristine\9a\9a71415db2b420aa1d6eae9166b5128aaab4c402.svn-base F:\kams\war119\czx.py F:\kams\war119\zabbix_server_modify.sh F:\kams\war120\czx.py F:\kams\war120\test.py F:\kams\war120\zabbix_server_modify.sh

 

轉自

Python os.walk文件遍歷 - 星星故鄉 - 博客園 https://www.cnblogs.com/lincj/p/5617605.html

 

python 簡單示例說明os.walk和os.path.walk的不同

import os,os.path
def func(arg,dirname,names):
    for filespath in names:
        print os.path.join(dirname,filespath)
 
if __name__=="__main__":
    print "==========os.walk================"
    index = 1
    for root,subdirs,files in os.walk("c:\\test"):
        print "",index,""
        index += 1
        for filepath in files:
            print os.path.join(root,filepath)
        for sub in subdirs:
            print os.path.join(root,sub)
    print "==========os.path.walk================"
    os.path.walk("c:\\test",func,())

 

 

結果如下:

 

總結:

(1)兩者都能實現達到同一個效果

(2)在python3中,os.path.walk要被os.walk取代了,大家盡量用os.walk

(3)os.walk明顯比os.path.walk要簡潔一些,起碼它不需要回調函數,遍歷的時候一目了然:root,subdirs,files

(4)可能你在煩惱,os.path.walk的第三個參數arg有什么用,好吧,當你os.path.walk()賦值給arg的時候,你就可以在第二個參數對應的func中用arg了

 

轉自

python 簡單示例說明os.walk和os.path.walk的不同 - CSDN博客 https://blog.csdn.net/emaste_r/article/details/12442675


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM