<
>

Python遍历目录中的所有文件的方法

2020-06-25 07:40:33 来源:易采站长站 作者:易采站长站整理

os.walk生成器
os.walk(PATH), PATH是个文件夹路径,当然可以用.或者../这样啦.
返回的是个三元元组为元素的列表, 每个元素代表了一个文件夹下的内容.第一个就是当前文件夹下内容.
返回的三元元组代表(该工作文件夹, 该文件夹下的文件夹的列表, 该文件夹下文件的列表).
所以,
获得所有子文件夹, 就是(d代表这三元元组):


os.path.join(d[0],d[1]);

获得所有子文件, 就是:


os.path.join(d[0],d[2]);

以下例子使用了两套循环, 遍历后得到所有文件名的list后再循环所有文件:


result = [os.path.join(dp, f) for dp, dn, fs in os.walk("_pages") for f in fs if os.path.splitext(f)[1] == '.html']for fname in result:
#do something

实际等于


result=[]for dp, dn, fs in os.walk("_pages"):
for f in fs:
if (os.path.splitext(f)[1] == '.html'):
result.append(os.path.join(dp, f))
for fname in result:
#do something

最后判断是否html后缀获得文件名, 还可以使用glob:


result = [y for x in os.walk(PATH) for y in glob.glob(os.path.join(x[0], '*.txt'))]

还可以使用迭代器方法:


from itertools import chain
import glob
result = (chain.from_iterable(glob.iglob(os.path.join(x[0], '*.txt')) for x in os.walk('.')))

进阶
标准文件数遍历生成器os.walk既强大又灵活,不过os.walk还缺乏应用程序需要的一些细节上的处理能力,例如根据某种模式选择文件,对所有文件(或目录)进行排序,或只遍历当前目录不进入其子目录,因此需要对接口对应进行封装。


import os, fnmatch

def filter_files(dirname, patterns='*', single_level=False, yield_folders=False):
patterns = patterns.split(';')
allfiles = [] for rootdir, subdirname, files in os.walk(dirname):
print subdirname
allfiles.extend(files)
if yield_folders:
allfiles.extend(dubdirname)
if single_level:
break
allfiles.sort()
for eachpattern in patterns:
for eachfile in fnmatch.filter(allfiles, eachpattern):
print os.path.normpath(eachfile)

说明:
1.extend与append的区别
列表是以类的形式实现的。“创建”列表实际上是将一个类实例化。因此,列表有多种方法可以操作。  列表可包含任何数据类型的元素,单个列表中的元素无须全为同一类型。 append() 方法向列表的尾部添加一个新的元素。只接受一个参数,extend()方法只接受一个列表作为参数,并将该参数的每个元素都添加到原有的列表中。

暂时禁止评论

微信扫一扫

易采站长站微信账号