Python使用os.walk或os.path.walk遍历文件树

Python OS模块中提供了os.walk()os.path.walk()两种方法都可以遍历文件树。前者可以列出文件树中的文件和文件夹,后者可以对每个遍历的文件和文件夹调用visit访问函数。

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

  • top:要遍历的文件夹
  • topdown:是否自顶而下遍历。默认为True, 表示先遍历父目录,再遍历子目录。如果为False表示先遍历子目录再遍历父目录。
  • onerror:默认为None表示遍历出错时,忽略错误。否则给出一个错误处理函数。
  • 函数返回遍历的目录、文件夹列表、文件列表,可以使用for循环遍历。

示例如下: c:/test文件夹下有:两个子目录sub1和sub2,两个文件1.txt和2.txt。sub1文件夹中有sub11.txt和sub12.txt两个文件。sub2文件夹为空。

[python]for root,dirs,files in os.walk('c:/test'):
print root,dirs,files[/python]

运行结果:

[python]c:/test ['sub1', 'sub2'] ['1.txt', '2.txt']
c:/test\sub1 [] ['sub11.txt', 'sub12.txt']
c:/test\sub2 [] [][/python]

默认topdown=True,自顶而下。root表示当前遍历的路径,dirs表示当前遍历目录下的子文件夹列表,files表示当前遍历目录下的文件列表

首先遍历test文件夹,root=‘c:/test’,含有两个子文件夹dirs=[‘sub1’,’sub2’],含有两个文件files=[‘1.txt’,’2.txt’]

再遍历子目录sub1,root=‘c:/test\sub1’,没有子文件夹dirs=[],包含两个文件files=[‘sub11.txt’,’sub12.txt’]

再遍历子目录sub2,root=‘c:/test\sub2’,没有子文件夹和子文件

-----------------------------------------------------------------------------------------------------------------

如果将topdown设置为False,则先遍历子文件夹sub1,sub2,再遍历父文件夹test。运行结果如下:

[python]c:/test\sub1 [] ['sub11.txt', 'sub12.txt']
c:/test\sub2 [] []
c:/test ['sub1', 'sub2'] ['1.txt', '2.txt'][/python]

os.path.walk(path,visit,arg)

os.path提供了通用的路径名操作。os.path.walk参数也可记为(top,func,arg)。

  • path:要遍历的文件夹
  • visit:对每个遍历的路径调用的回调函数。visit函数的参数为(arg,dirname,names)。arg为os.path.walk函数的第三个参数,dirname表示当前遍历的文件夹,names表示当前文件夹下的文件列表(包括文件夹)。visit函数可以修改names来影响dirname目录下要遍历的子文件夹(比如避免遍历某些文件夹)
  • arg:传递给visit函数的参数,可以是None,或者一个元组。

示例如下,test文件夹的内容同上。

[python]def visit(arg,dirname,names):
print dirname,names

os.path.walk('c:/test',visit,None)[/python]

运行结果

[python]c:/test ['1.txt', '2.txt', 'sub1', 'sub2']
c:/test\sub1 ['sub11.txt', 'sub12.txt']
c:/test\sub2 [][/python]

首先遍历test,dirname=‘test’,names=[‘1.txt’,’2.txt’,’sub1’,’sub2’]包括文件和文件夹;

再遍历test\sub1,dirname=‘test\sub1’,name=[‘sub11.txt’,’sub12.txt’]

再遍历test\sub2,dirname=’test\sub2’,names=[]

作者:JarvisChu
原文链接:Python使用os.walk或os.path.walk遍历文件树
版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

发表评论