如何使用 python 更快地搜索和读取特定文件夹中的文本文件
How to search and read a text file in a specific folder faster using python
我编写了一个简单的 python 脚本来搜索文件夹(包含大约 400 万个文件)中的日志文件并读取该文件。
目前,整个操作的平均时间为 20 秒。我想知道有没有什么办法可以更快地得到响应。
下面是我的脚本
import re
import os
import timeit
from datetime import date
log_path = "D:\Logs Folder\"
rx_file_name = r"[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}"
log_search_script = True
today = str(date.today())
while log_search_script:
try:
log_search = input("Enter image file name: ")
file_name = re.search(rx_file_name, log_search).group()
log_file_name = str(file_name) + ".log"
print(f"\nLooking for log file '{log_file_name}'...\n")
pass
except:
print("\n ***** Invalid input. Try again! ***** \n")
continue
start = timeit.default_timer()
if log_file_name in os.listdir(log_path):
log_file = open(log_path + "\" + log_file_name, 'r', encoding="utf8")
print('\n' + "--------------------------------------------------------" + '\n')
print(log_file.read())
log_file.close()
print('\n' + "--------------------------------------------------------" + '\n')
print("Time Taken: " + str(timeit.default_timer() - start) + " seconds")
print('\n' + "--------------------------------------------------------" + '\n')
else:
print("Log File Not Found")
search_again = input('\nDo you want to search for another log ("y" / "n") ?').lower()
if search_again[0] == 'y':
print("======================================================\n\n")
continue
else:
log_search_script = False
你的问题是:
if log_file_name in os.listdir(log_path):
这有两个问题:
os.listdir
将创建一个巨大的列表,这可能会花费很多时间(并且 space...)。
... in ...
部分现在将线性遍历这个巨大的列表并搜索文件。
相反,让您的 OS 完成艰苦的工作,然后 "ask for forgivness, not permission"。只是 假设 文件在那里并尝试打开它。如果它实际上不存在 - 将引发错误,我们将捕获该错误:
try:
with open(log_path + "\" + log_file_name, 'r', encoding="utf8") as file:
print(log_file.read())
except FileNotFoundError:
print("Log File Not Found")
你可以使用 glob。
import glob
print(glob.glob(directory_path))
我编写了一个简单的 python 脚本来搜索文件夹(包含大约 400 万个文件)中的日志文件并读取该文件。 目前,整个操作的平均时间为 20 秒。我想知道有没有什么办法可以更快地得到响应。
下面是我的脚本
import re
import os
import timeit
from datetime import date
log_path = "D:\Logs Folder\"
rx_file_name = r"[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}"
log_search_script = True
today = str(date.today())
while log_search_script:
try:
log_search = input("Enter image file name: ")
file_name = re.search(rx_file_name, log_search).group()
log_file_name = str(file_name) + ".log"
print(f"\nLooking for log file '{log_file_name}'...\n")
pass
except:
print("\n ***** Invalid input. Try again! ***** \n")
continue
start = timeit.default_timer()
if log_file_name in os.listdir(log_path):
log_file = open(log_path + "\" + log_file_name, 'r', encoding="utf8")
print('\n' + "--------------------------------------------------------" + '\n')
print(log_file.read())
log_file.close()
print('\n' + "--------------------------------------------------------" + '\n')
print("Time Taken: " + str(timeit.default_timer() - start) + " seconds")
print('\n' + "--------------------------------------------------------" + '\n')
else:
print("Log File Not Found")
search_again = input('\nDo you want to search for another log ("y" / "n") ?').lower()
if search_again[0] == 'y':
print("======================================================\n\n")
continue
else:
log_search_script = False
你的问题是:
if log_file_name in os.listdir(log_path):
这有两个问题:
os.listdir
将创建一个巨大的列表,这可能会花费很多时间(并且 space...)。... in ...
部分现在将线性遍历这个巨大的列表并搜索文件。
相反,让您的 OS 完成艰苦的工作,然后 "ask for forgivness, not permission"。只是 假设 文件在那里并尝试打开它。如果它实际上不存在 - 将引发错误,我们将捕获该错误:
try:
with open(log_path + "\" + log_file_name, 'r', encoding="utf8") as file:
print(log_file.read())
except FileNotFoundError:
print("Log File Not Found")
你可以使用 glob。
import glob
print(glob.glob(directory_path))