在Python中查找文件

167 投票
9 回答
467493 浏览
提问于 2025-04-15 15:57

我有一个文件,它可能在每个用户的电脑上的不同位置。有没有办法可以搜索这个文件?也就是说,我想传入文件名和要搜索的目录树,看看能不能找到这个文件?

9 个回答

28

我使用了一个版本的 os.walk,在一个比较大的文件夹里,花了大约3.5秒。我尝试了两个随机的解决方案,但效果都不太明显。然后我就做了:

paths = [line[2:] for line in subprocess.check_output("find . -iname '*.txt'", shell=True).splitlines()]

虽然这个方法只适用于POSIX系统,但我只花了0.25秒。

从这个结果来看,我觉得完全有可能在不依赖平台的情况下大幅优化整个搜索过程,不过我在这里就停止了研究。

52

在Python 3.4或更新的版本中,你可以使用pathlib这个工具来进行递归查找,也就是在文件夹及其子文件夹中寻找文件。

>>> import pathlib
>>> sorted(pathlib.Path('.').glob('**/*.py'))
[PosixPath('build/lib/pathlib.py'),
 PosixPath('docs/conf.py'),
 PosixPath('pathlib.py'),
 PosixPath('setup.py'),
 PosixPath('test_pathlib.py')]

参考链接:https://docs.python.org/3/library/pathlib.html#pathlib.Path.glob

在Python 3.5或更新的版本中,你也可以用另一种方式进行递归查找,方法如下:

>>> import glob
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']

参考链接:https://docs.python.org/3/library/glob.html#glob.glob

347

os.walk 是一个很有用的工具,它可以帮助你找到第一个符合条件的文件或文件夹:

import os

def find(name, path):
    for root, dirs, files in os.walk(path):
        if name in files:
            return os.path.join(root, name)

而这个方法可以找到所有符合条件的文件或文件夹:

def find_all(name, path):
    result = []
    for root, dirs, files in os.walk(path):
        if name in files:
            result.append(os.path.join(root, name))
    return result

这个方法则可以用来匹配特定的模式:

import os, fnmatch
def find(pattern, path):
    result = []
    for root, dirs, files in os.walk(path):
        for name in files:
            if fnmatch.fnmatch(name, pattern):
                result.append(os.path.join(root, name))
    return result

find('*.txt', '/path/to/dir')

撰写回答