如何使用 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):

这有两个问题:

  1. os.listdir 将创建一个巨大的列表,这可能会花费很多时间(并且 space...)。
  2. ... 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))