在Python中,文件遍历是一件非常轻松简便的工作。官方给出的示例:
import os
from os.path import join, getsize
for root, dirs, files in os.walk('python/Lib/email'):
print root, "consumes",
print sum([getsize(join(root, name)) for name in files]),
print "bytes in", len(files), "non-directory files"
if 'CVS' in dirs:
dirs.remove('CVS') # don't visit CVS directories
可以看到,基本上就是依赖os.walk()这个函数来实现的。从结构上来看,for root, dirs, files in os.walk(...),很容易让人认为os.walk(...)生成了一个迭代器。迭代器的next方法可能会返回下一层次的文件夹内容。事实上,os.walk()是一个生成器函数。生成器与迭代器,是Python引入的几大特性之一,而生成器要比迭代器高级一些。至于生成器的工作原理和适用场合,可以先从os.walk()的源码说起。
os.walk()源码:
def walk(top, topdown=True, onerror=None, followlinks=False):
from os.path import join, isdir, islink
try:
# Note that listdir and error are globals in this module due
# to earlier import-*.
names = listdir(top)
except error, err:
if onerror is not None:
onerror(err)
return
dirs, nondirs = [], []
for name in names:
if isdir(join(top, name)):
dirs.append(name)
else:
nondirs.append(name)
if topdown:
yield top, dirs, nondirs
for name in dirs:
path = join(top, name)
if followlinks or not islink(path):
for x in walk(path, topdown, onerror, followlinks):
yield x
if not topdown:
yield top, dirs, nondirs
实现的原理很简单,首先列出top文件夹下所有的文件(夹)的名字,names,然后遍历每一个name,来判断name是文件夹还是文件,分别放到不同的列表中。这时,yield语句出现了,这正是生成器的魔法所在。任何包含yield语句的函数,都被称作是生成器函数。如何理解这个表达式呢,可以把它看做是和return一样的功效,即让函数返回结果。事实上,yield并不是单纯的return,它将top,dirs,noddirs返回后,就冻结了,就是说,这个函数不会再次执行。那什么时候会恢复执行呢,就是当你再次去调用walk方法的时候,此时,函数被激活,继续执行。
yield并没有太大特别之处,只不过它能够使函数的执行被冻结,并且能够被激活再次进入运行状态。那么,os.walk()就不再神秘了。再次进入运行态后,就会进入 递归调用了,即 for x in walk(path.....): yield x 的功能。
分享到:
相关推荐
python os.walk 遍历所有文件 文件夹(csdn)————程序
C++实现python的os模块的walk函数,可绝对路径,相对路径,源代码以及编译好的二进制可执行文件。
scandir,更好的目录迭代器和更快的os.walk() scandir()是类似于os.listdir()的目录迭代函数,不同之处在于,它不返回裸文件名列表,而是生成DirEntry对象,该对象包含文件类型和统计信息以及名称。 使用scandir()...
本篇文章主要介绍了python使用os.listdir和os.walk获得文件的路径的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
if __name__ == ‘__main__’: try: ”’traval and list all files and all dirs”’ for root, dirs, files in os.walk(‘D:’ + os.sep + ‘Python27’): print ‘——————-directory < ‘ + root + ...
主要介绍了Python使用os.listdir和os.walk获取文件路径,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
关于Python的文件遍历,大概有两种方法,一种是较为便利的os.walk(),还有一种是利用os.listdir()递归遍历。 方法一:利用os.walk os.walk可以自顶向下或者自底向上遍历整个文件树,然后返回一个含有3个元素的tuple...
在python3.6版本中去掉了os.path.walk()函数 os.walk() 函数声明:walk(top,topdown=True,oneerror=None) 1、参数top表示需要遍历的目录树的路径 2、参数农户topdown默认是”True”,表示首先返回根目录树下的文件...
本文采用os.walk()和os.listdir()两种方法,获取指定文件夹下的文件名。 一、os.walk() 模块os中的walk()函数可以遍历文件夹下所有的文件。 os.walk(top, topdown=Ture, onerror=None, followlinks=False) 该函数...
下面小编就为大家分享一篇python 获取文件下所有文件或目录os.walk()的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
import os def os_demo(): # 执行命令 dirs = os.popen("dir").read() print(dirs) # 打印目录树 dirs_info = os.scandir() for info in dirs_info: print("文件名: {}, 路径: {}, inode: {},
检查重复项 通过比较所有文件的 md5sum 来检查计算机上的重复文件。 使用 Tkinter、os.walk 和其他操作系统调用。 os-walk.py walk-and-hash.py hash-and-delete.py
#top是目标文件夹(绝对路径),os.walk会读取其内的文件及文件夹直至空。 for a,b,c in os.walk(top='dir'): n = len(c) #对文件大小进行过滤 if n >= 10: for i in range(n): #根据命名规则进行匹配分割,eg: ...
利用 os.walk()函数遍历当前文件夹下的所有文件和文件夹得到名称 再利用 正则 与数据库对比,从而得到缺少哪个文件 不仅可以在班委收集数据统计,还可以用于文件对比方面(需改动代码) 使用教程:将脚本放置你所要...
var walk = require ( 'vz.walk' ) , yieldify = require ( 'vz.yieldify' ) , fs = require ( 'fs' ) , exists = yieldify ( fs . exists ) ; walk ( function * ( ) { if ( yield exists ( 'foo.bar' ) ) ...
方式一: #!/usr/bin/python # -*- coding: utf-8 -*- import os def gci(filepath): #遍历filepath下所有文件,包括子目录 ...for fpathe,dirs,fs in os.walk('/root'): for f in fs: print(os.path.join(fpathe,f))