在python中find一个文件

我有一个文件可能在每个用户的机器上不同的地方。 有没有一种方法来实现文件的search? 我可以通过文件的名称和目录树search的方法?

os.walk是答案,这将find第一个匹配:

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

这将find所有匹配:

 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') 

我使用了os.walk一个版本,并且在一个更大的目录上有3.5秒左右的时间。 我尝试了两个随机解决scheme,没有太大的改善,然后只是做了:

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

虽然它只是POSIX,我得到了0.25秒。

因此,我认为完全可以通过平台无关的方式优化整个search,但这是我停止研究的地方。

为了快速,独立于操作系统的search,使用scandir

https://github.com/benhoyt/scandir/#readme

有关详细信息,请阅读http://bugs.python.org/issue11406

请参阅os.walk或os.listdir的os模块

请参阅os.walk这个问题, 而不是挖掘到下面的示例代码目录

如果你在Ubuntu上使用Python,而你只希望它能在Ubuntu上工作,那么使用terminal的locate程序是一个更快的方法。

 import subprocess def find_files(file_name): command = ['locate', file_name] output = subprocess.Popen(command, stdout=subprocess.PIPE).communicate()[0] output = output.decode() search_results = output.split('\n') return search_results 

search_results是绝对文件path的list 。 这比上面的方法快了一万倍,我做了一次search就快了72,000倍。

如果您正在使用Python 2,则可能会遇到由自陷链接引起的无限recursion问题。

这个脚本将避免遵循这些。

 import os from scandir import scandir import ctypes def is_sym_link(path): # http://stackoverflow.com/a/35915819 FILE_ATTRIBUTE_REPARSE_POINT = 0x0400 return os.path.isdir(path) and (ctypes.windll.kernel32.GetFileAttributesW(unicode(path)) & FILE_ATTRIBUTE_REPARSE_POINT) def find(base, filenames): hits = [] def find_in_dir_subdir(direc): content = scandir(direc) for entry in content: if entry.name in filenames: hits.append(os.path.join(direc, entry.name)) elif entry.is_dir() and not is_sym_link(os.path.join(direc, entry.name)): try: find_in_dir_subdir(os.path.join(direc, entry.name)) except UnicodeDecodeError: print "Could not resolve " + os.path.join(direc, entry.name) continue if not os.path.exists(base): return else: find_in_dir_subdir(base) return hits 

它返回一个列表,其中包含指向文件名列表中的文件的所有path。 用法:

 find("C:\\", ["file1.abc", "file2.abc", "file3.abc", "file4.abc", "file5.abc"]) 
 import os name='Ten Year Load Forecasts 2017-2026.xlsm' path='F:\ ' def find(name,path): for root, dirs, files in os.walk(path): if name in files: return os.path.join(root, name) #And this will find all matches: 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 #And this will match a pattern: 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)) print(result) return result find('*.xlsm', '/path/to/dir') 

我试过使用这个代码,但没有输出。 我打印了一个空的数组。 我是否正确使用它?