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),也就是说我们需要不断的遍历它,来获得所有的内容。
每次遍历的对象都是返回的是一个三元组(root,dirs,files)
root 所指的是当前正在遍历的这个文件夹的本身的地址
dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
如果topdown 参数为真,walk 会遍历top文件夹,与top文件夹中每一个子目录。
举个例子
如果我们有如下的文件结构:
a -> b -> 1.txt, 2.txt
c-> 3.txt
d->
4.txt5.txtfor (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 infiles:
path=os.path.join(root,f)#遍历d
d: root = 'a\\b'dirs=[]
files=[]
遍历完毕,退出循环
3.简单的例子
保持目录 a 的目录结构,在 b 中创建对应的文件夹,并把a中所有的文件加上后缀 _bak
importos
Root= 'a'Dest= 'b'
for (root, dirs, files) inos.walk(Root):
new_root= root.replace(Root, Dest, 1)if notos.path.exists(new_root):
os.mkdir(new_root)for d indirs:
d=os.path.join(new_root, d)if notos.path.exists(d):
os.mkdir(d)for f infiles:#把文件名分解为 文件名.扩展名
#在这里可以添加一个 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())exceptIOError as e:print(e)
转自
作者:MikuLovely
链接:https://www.jianshu.com/p/bbad16822eab
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
#!/usr/bin/python#coding=utf-8
importosdefdirlist(path):for root,dirs,files in os.walk(path): #将os.walk在元素中提取的值,分别放到root(根目录),dirs(目录名),files(文件名)中。
for file infiles: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
importos,os.pathdefvisit(arg,dirname,names):for filespath innames:printos.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()的使用
importos#枚举dirPath目录下的所有文件
defmain():#begin
fileDir = "F:" + os.sep + "kams" #查找F:\aaa 目录下
for root, dirs, files inos.walk(fileDir):#begin
for dir indirs:#begin
print(os.path.join(root, dir))#end
for file infiles:#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\12F:\kams\.svn\pristine\96F:\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的不同
importos,os.pathdeffunc(arg,dirname,names):for filespath innames:printos.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 infiles:printos.path.join(root,filepath)for sub insubdirs:printos.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