我有一個文件可能位於每個用戶機器的不同位置。有沒有一種方法來實現文件的搜索?我可以通過文件名和目錄樹進行搜索的方法?在python中查找文件
回答
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')
見os module爲os.walk或os.listdir
對於快速,獨立於操作系統的搜索,使用scandir
具體來說,使用'scandir.walk() per @ Nadia的回答。請注意,如果你使用Python 3.5+,'os.walk()'已經有'scandir.walk()'加速。另外,[PEP 471](https://www.python.org/dev/peps/pep-0471/)可能是一個比這個問題更好的閱讀信息的文檔。 – 2016-12-15 15:29:49
我用的os.walk
一個版本,並在更大的目錄傳開時間3.5秒。我嘗試了兩種隨機解,沒有很大的改善,那麼就做:
paths = [line[2:] for line in subprocess.check_output("find . -iname '*.txt'", shell=True).splitlines()]
雖然這是POSIX的唯一,我得到了0.25秒。
由此,我認爲這是完全有可能的,以優化整個搜索了很多獨立於平臺的方式,但是這是我停止了研究。
如果您正在使用Python在Ubuntu,你只希望它在Ubuntu的工作基本上更快的方法是利用終端的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
是絕對文件路徑的list
。這比上面的方法快10,000倍,而且我做了一次搜索,速度快了72,000倍。
如果您正在使用Python 2個工作必須與所造成的自參照符號鏈接窗口無限遞歸的問題。
此腳本將避免以下這些。請注意,這是特定窗口!
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
它返回一個列表,其中包含所有指向文件名列表中文件的路徑。 用法:
find("C:\\", ["file1.abc", "file2.abc", "file3.abc", "file4.abc", "file5.abc"])
請注意,這是特定窗口 – Leliel 2017-11-29 20:37:12
@Leliel已將其添加到答案。感謝您的反饋意見。 – 2017-11-30 21:08:47
- 1. 的Python:文件中查找
- 2. 在Python中查找空文件
- 3. Python:併發文件查找
- 4. Python - 查找TTF文件
- 5. 在Python中查找符號鏈接文件的文件類型
- 6. Python 3:查找文件中的行
- 7. Python首先在哪裏查找文件?
- 8. 查找在Python串線(不是文件)
- 9. Python - 在打開的python文件中查找東西
- 10. Python中查找文本
- 11. 在文件中查找
- 12. 在文件中查找
- 13. 在文件中查找anagrams
- 14. 的Python:查找文本文件
- 15. 的Python:查找文本文件
- 16. 從python中的部分文件名中查找文件
- 17. 在python中查看文件?
- 18. 查找文件查找文件不在解決方案中
- 19. Python:在兩個文件中查找共同文本
- 20. 如何使用Python在文本文件中查找所有isbn?
- 21. 解析日誌文件以在python中查找相關事件
- 22. 在Python中查找頭文字
- 23. 在python中查找並替換文本
- 24. 如何在python中查找csv文件中的特定行
- 25. 在Python中的os.walk()中查找文件路徑
- 26. 在Python中的每個rwo CSV文件中查找元素'0123'
- 27. 在Python中查找txt文件中的字符串列表
- 28. 在python中查找csv文件中的最小,最大值
- 29. Python:在文件中查找字符串並打印它在
- 30. 如何使用python查找文件夾中的特定文件
注意,這些例子只能找到文件,而不是具有相同名稱的目錄。如果你想在這個名字的目錄中找到任何**對象,你可以使用'如果文件中的名字或目錄中的名字' – 2014-10-17 23:29:51
小心區分大小寫。 '用於文件中的名稱:''在文件系統中的'super-photo.JPG'時將無法查找'super-photo.jpg'。 (我一生中的一個小時我想回來;-)有點亂的解決方法是'如果str.lower(名稱)在[x。lower()for x in files]' – 2014-12-16 22:53:25
如何使用** yield **而不是準備結果列表? ..... if fnmatch.fnmatch(name,pattern): yield os.path.join(root,name) – Berci 2015-05-03 21:26:13