阅读 167

【通用文件操作】文件搜索

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一、前言

很多情况下我们都需要进行文件搜索。比如找一个很早之前的文件,或者想删除重复的文件等。前者只需要更具名称来查找文件,而后者的话还需要查找文件的内容。今天我们就来实现文件搜索的操作。

二、fnmatch模块

1、遍历

在搜索文件之前,我们有一个关键操作,就是遍历文件夹,这部分代码如下:

import os 
basedir = r"D:\\" 
for root, dirs, files in os.walk(basedir): 
    for file in files: 
        path = os.path.join(root, file) 
        print(path)
复制代码

其中path就是我们遍历到的文件绝对路径。有了这个我们就可以开始搜索文件了。

2、搜索

在Python中内置了一个fnmatch模块,我们可以使用这个模块来匹配目录,具体使用如下:

from fnmatch import fnmatch
# 匹配目录
match = fnmatch("test.jpg", "test.jpg")
print(match)
复制代码

我们调用了fnmatch函数,传入了要匹配的内容以及匹配规则。这里我们直接匹配两个字符串,删除结果如下:

True
复制代码

它会返回一个bool值。但是这个和直接if判断不是一样的吗,这个fnmatch模块有什么特殊功能吗。答案是有的,除了直接匹配,fnmatch还支持通配符的操作,比如下面的代码:

from fnmatch import fnmatch
match = fnmatch("test.jpg", "*.jpg")
print(match)
复制代码

这里我们用test.jpg*.jpg来匹配。其中*就表示任意多个字符,也就是匹配.jpg结尾的文件。除了*还有一些其它通配符,具体如下:

通配符作用
*匹配所有字符
?匹配单个字符
[seq]匹配指定范围内的字符
[!seq]匹配指定范围外的字符

我们可以根据需求来写匹配规则。除了fnmatch函数,fnmatch中还有一个filter函数,这里就不展开了。

三、文件搜索

我们结合遍历和匹配的操作写出文件搜索的功能,代码如下:

import os
from fnmatch import fnmatch
basedir = r"D:\\"
for root, dirs, files in os.walk(basedir):
    for file in files:
        path = os.path.join(root, file)
        # 匹配D盘下的所有gif图片
        if fnmatch(path, "*.gif"):
            print(path)
复制代码

上面就是搜索D盘下所有GIF图的操作,大家可以根据自己的需求来修改。如果要查找路径中带有test的文件可以修改为如下:

import os
from fnmatch import fnmatch
basedir = r"D:\、"
for root, dirs, files in os.walk(basedir):
    for file in files:
        path = os.path.join(root, file)
        if fnmatch(path, "*test*"):
            print(path)
复制代码

这里我们就是修改了匹配规则。

文章分类
后端
文章标签