python中os.walk是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。
1.载入
要使用os.walk,首先要载入该函数
可以使用以下两种方法
- import os
- from os import walk
2.使用
os.walk的函数格式声明为:
walk(top, topdown=True, οnerrοr=None, followlinks=False)
参数
- top 是你所要遍历的目录的地址
- topdown 为真,则优先遍历top目录,否则优先遍历top的子目录(默认为开启)
- onerror 需要一个 callable 对象,当walk需要异常时,会调用
- followlinks 如果为真,则会遍历目录下的快捷方式(linux 下是 symbolic link)实际所指的目录(默认关闭)
os.walk 的返回值是一个生成器(generator),也就是说我们需要不断的遍历它,来获得所有的内容。
可以得到一个三元tupple(dirpath, dirnames, filenames),
第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件。
dirpath 是一个string,代表目录的路径,
dirnames 是一个list,包含了dirpath下所有子目录的名字。
filenames 是一个list,包含了非目录文件的名字。
如果topdown 参数为真,walk 会遍历top文件夹,与top文件夹中每一个子目录。
3.举例子:
文件结构如下:
a -> b -> 1.txt, 2.txt
c -> 3.txt
d ->
4.txt
5.txt使用os.walk做遍历:
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 = []遍历完毕,退出循环
4.实战案例
使用一个实战案例加深对os.walk模块的认识。
我们在/tmp目录下建立一个file目录,里面的组织结构如下:
import os path = '/tmp/file' for p,d,f in os.walk(path): print(p,d,f)
os.walk返回的是1个元组,这个元组有3个元素,分别是dirpath, dirnames, filenames,所以使用3个变量p,d,f去接收这3个元素,即for p,d,f in os.walk(path)
os.walk输入一个路径名称,以yield的方式(其实是一个生成器)返回一个三元组 dirpath, dirnames, filenames,
dirpath为目录的路径,为一个字符串。比如上面的/tmp/file和/tmp/file/file1等。
dirnames列出了目录路径下面所有存在的目录的名称。比如在 /tmp/file下面有两个目录:file1和file2,那么它就列出了这个目录路径下的目录名称。
filenames列出了目录路径下面所有文件的名称。同样在 /tmp/file下面有两个文件file_test2.txt 和 file_test1.txt,那么程序将会列出这两个文件名。
如何获得一个路径下面所有的文件路径:
import os
path = '/tmp/file'
for p,d,f in os.walk(path):
for filename in f:
print(os.path.join(p,filename))
f 是个列表,所以对f进行for循环遍历,取里面的每一个文件名,最后把文件名组织成带路径的,即os.path.join(p,filename)。
dirnames也是一个列表,每个元素是目录名,这里没打印目录名。