python中如何打开一个文件夹中的所有文件-Python遍历目录中的所有文件的方法

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()方法只接受一个列表作为参数,并将该参数的每个元素都添加到原有的列表中。

2. fnmatch模块

fnmatch 模块使用模式来匹配文件名。模式语法和 Unix shell 中所使用的相同. 星号(*) 匹配零个或更多个字符, 问号(?) 匹配单个字符。你也可以使用方括号来指定字符范围,例如 [0-9] 代表一个数字,其他所有字符都匹配它们本身。

1) fnmatch.fnmatch(name, pattern)方法:测试name是否匹配pattern,返回true/false

2) fnmatch.filter(names, pat)实现列表特殊字符的过滤或筛选,返回符合匹配模式的字符列表,当然names表示的是列表

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值