在Python中查找文件
我有一个文件,它可能在每个用户的电脑上的不同位置。有没有办法可以搜索这个文件?也就是说,我想传入文件名和要搜索的目录树,看看能不能找到这个文件?
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']
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')