写在之前

今天的文章是介绍如何用 Python 去定位特定类型的文件,会讲到用字符串匹配文件名定位特定文件以及顺带介绍一下遍历目录树的函数,通过今天的这一部分以及之前文章讲到的文件获取属性的操作,可以做很多有意思的事情。

定位特定文件

定位特定的文件,可以使用 fnmatch 以及 glob 这两个标准库,我们下面来分别看一下。

1. 使用 fnmatch 标准库

一般的话我们想要查找特定类型的文件,可以通过字符串的前缀匹配和后缀匹配来查找,具体实例如下所示:

> import os
> [txt for txt in os.listdir('.') if txt.endswith('.txt')]
['b.txt', 'a.txt']

其实大部分的情况下这种用字符串匹配的方法来查找文件就足够可以满足需要,如果有些情况下需要更加灵活一点的字符串匹配,就可以使用 fnmatch 库,这是一个专门用来进行文件名匹配的库,支持使用通配符来进行文字匹配(比如'*','"htmlcode">

> import os
> import fnmatch
> os.listdir('.')
['test.py', 'c.py', 'b.txt', 'a.txt']
> [txt for txt in os.listdir('.') if fnmatch.fnmatch(txt, '*.txt')]
['b.txt', 'a.txt']
> [file for file in os.listdir('.') if fnmatch.fnmatch(file, '[a-c]*')]
['c.py', 'b.txt', 'a.txt']
> [file for file in os.listdir('.') if fnmatch.fnmatch(file, '[!a-c]*')]
['test.py']

fnmatchcase 函数与 fnmatch 函数几乎一样,只是在匹配的时候会忽略大小写字母;filter 函数与 fnmatch 比较类似,区别在于fnmatch 一次只对一个文件名匹配,而 filter 一次可以对多个文件名进行匹配判断,下面我们就再来看一下 filter 的用法:

> import os
> import fnmatch
> file = os.listdir('.')
> file
['test.py', 'c.py', 'b.txt', 'a.txt']
> fnmatch.filter(file, '[a-c]*')
['c.py', 'b.txt', 'a.txt']
> fnmatch.filter(file, '[!a-c]*')
['test.py']

2.使用 glob 定位

我们在上面介绍的获取特定类型的文件列表,首先是通过 os.listdir 获取全部的文件列表,然后通过字符串匹配或者使用 fnmatch 进行文件名模式匹配来定位,习惯了 Python 的简洁优雅,这多出来的一步总觉得哪里怪怪的,好在我现在知道了 glob。

glob 的作用相当于 os.listdir + fnmatch 的组合,使用 glob 以后,就不需要用 os.listdir 获取文件列表,直接通过模式匹配就可以解决了,具体操作如下所示:

> import glob
> glob.glob('*.txt')
['b.txt', 'a.txt']
> glob.glob('[a-c]*')
['c.py', 'b.txt', 'a.txt']
> glob.glob('[!a-c]*')
['test.py']

可以看到,Python 真的非常的灵活,光是定位目录下特定的文件类型我就已经介绍了 3 种方式,一般情况下就用字符串匹配就可以解决,如果需要更加灵活一点的的,可以使用 fnmatch 和 glob。

遍历目录树

再上一节中我们都是查找某个目录下的文件然后通过匹配去定位自己需要的文件类型。但是在实际的应用过程中我们更可能遇到的是某个目录及其子目录下的所有文件。比如查找某个目录及其子目录下所有的 txt 文件等等,对于这类的需求,我们可以使用 os 模块下的「walk」函数。walk 函数遍历某个目录及其子目录,对于每一个目录,walk 返回一个三元组,依次是「当前目录」,「当前目录下的子目录」,「当前目录下的文件列表」。

下面我们来演示一下 os.walk 函数的用法,做一个小的练习,来遍历一下 /root/rocky0429 目录及其子目录下的所有 txt 和 图片文件:

import os
import fnmatch

search = ['*.txt', '*.jpg', '*.jpeg']
res = []

for root, dirnames, filenames in os.walk(os.path.expanduser('~/rocky0429')):
  for extension in search:
    for filename in fnmatch.filter(filenames, extension):
      res.append(os.path.join(root,filename))

    print(res)

以上就是Python 如何查找特定类型文件的详细内容,更多关于python 查找文件的资料请关注其它相关文章!

广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。