Самая первая версия парсера запросов с вашей u:l:p базы, не занимает память, использует диск. Максимальный размер файла с которого я вытаскивал - 62 GB Скорость: 660 секунд с 62GB базы 2 запроса. Примерно 50GB 1 запрос за 5 минут вытаскивает (у меня ssdшник, на харде не тестил) Недостатки: -софт не работает нормально с буфером обмена и клавиатурой, запросы вставляются только из буфера по кнопке -Работает только с одним файлом -работает только с кодировкой utf-8 Создаёт отдельное название папки и там файл с вашим запросом, время выполнения записывает в search_results.txt import tkinter as tk from tkinter import filedialog import time import os def search_in_database(database, queries, save_folder): start_time = time.time() for query in queries: query_folder = os.path.join(save_folder, query) os.makedirs(query_folder, exist_ok=True) with open(database, 'r', encoding='utf-8') as file: for line in file: if query in line: save_file_path = os.path.join(query_folder, "results.txt") with open(save_file_path, 'a', encoding='utf-8') as save_file: save_file.write(line) end_time = time.time() search_time = end_time - start_time results_file_path = os.path.join(save_folder, "search_results.txt") with open(results_file_path, 'w', encoding='utf-8') as results_file: results_file.write(f"Время поиска: {search_time} секунд\n") results_file.write("Результаты поиска сохранены в соответствующих папках.") def select_file(): file_path = filedialog.askopenfilename(filetypes=(("Text files", "*.txt"), ("All files", "*.*"))) database_entry.delete(0, 'end') database_entry.insert(0, file_path) def select_folder(): folder_path = filedialog.askdirectory() save_folder_entry.delete(0, 'end') save_folder_entry.insert(0, folder_path) def start_search(): database_path = database_entry.get() queries_text = queries_entry.get("1.0", 'end-1c') queries = queries_text.split("\n") save_folder = save_folder_entry.get() if not os.path.exists(save_folder): os.makedirs(save_folder) search_in_database(database_path, queries, save_folder) result_text.set(f"Поиск завершен. Результаты сохранены в {save_folder}") def paste_from_clipboard(): queries_text = root.clipboard_get() queries_entry.delete("1.0", "end") queries_entry.insert("1.0", queries_text) root = tk.Tk() root.title("Поиск в базе данных") label1 = tk.Label(root, text="Путь к базе данных:") label1.grid(row=0, column=0) database_entry = tk.Entry(root, width=50) database_entry.grid(row=0, column=1) select_file_button = tk.Button(root, text="Выбрать файл", command=select_file) select_file_button.grid(row=0, column=2) label2 = tk.Label(root, text="Запросы (по одному на строку):") label2.grid(row=1, column=0) queries_entry = tk.Text(root, height=4, width=50) queries_entry.grid(row=1, column=1) label3 = tk.Label(root, text="Папка для сохранения:") label3.grid(row=2, column=0) save_folder_entry = tk.Entry(root) save_folder_entry.grid(row=2, column=1) select_folder_button = tk.Button(root, text="Выбрать папку", command=select_folder) select_folder_button.grid(row=2, column=2) search_button = tk.Button(root, text="Начать поиск", command=start_search) search_button.grid(row=3, column=1) paste_button = tk.Button(root, text="Вставить из буфера", command=paste_from_clipboard) paste_button.grid(row=1, column=2) result_text = tk.StringVar() result_label = tk.Label(root, textvariable=result_text) result_label.grid(row=4, column=1) root.mainloop() Python import tkinter as tk from tkinter import filedialog import time import os def search_in_database(database, queries, save_folder): start_time = time.time() for query in queries: query_folder = os.path.join(save_folder, query) os.makedirs(query_folder, exist_ok=True) with open(database, 'r', encoding='utf-8') as file: for line in file: if query in line: save_file_path = os.path.join(query_folder, "results.txt") with open(save_file_path, 'a', encoding='utf-8') as save_file: save_file.write(line) end_time = time.time() search_time = end_time - start_time results_file_path = os.path.join(save_folder, "search_results.txt") with open(results_file_path, 'w', encoding='utf-8') as results_file: results_file.write(f"Время поиска: {search_time} секунд\n") results_file.write("Результаты поиска сохранены в соответствующих папках.") def select_file(): file_path = filedialog.askopenfilename(filetypes=(("Text files", "*.txt"), ("All files", "*.*"))) database_entry.delete(0, 'end') database_entry.insert(0, file_path) def select_folder(): folder_path = filedialog.askdirectory() save_folder_entry.delete(0, 'end') save_folder_entry.insert(0, folder_path) def start_search(): database_path = database_entry.get() queries_text = queries_entry.get("1.0", 'end-1c') queries = queries_text.split("\n") save_folder = save_folder_entry.get() if not os.path.exists(save_folder): os.makedirs(save_folder) search_in_database(database_path, queries, save_folder) result_text.set(f"Поиск завершен. Результаты сохранены в {save_folder}") def paste_from_clipboard(): queries_text = root.clipboard_get() queries_entry.delete("1.0", "end") queries_entry.insert("1.0", queries_text) root = tk.Tk() root.title("Поиск в базе данных") label1 = tk.Label(root, text="Путь к базе данных:") label1.grid(row=0, column=0) database_entry = tk.Entry(root, width=50) database_entry.grid(row=0, column=1) select_file_button = tk.Button(root, text="Выбрать файл", command=select_file) select_file_button.grid(row=0, column=2) label2 = tk.Label(root, text="Запросы (по одному на строку):") label2.grid(row=1, column=0) queries_entry = tk.Text(root, height=4, width=50) queries_entry.grid(row=1, column=1) label3 = tk.Label(root, text="Папка для сохранения:") label3.grid(row=2, column=0) save_folder_entry = tk.Entry(root) save_folder_entry.grid(row=2, column=1) select_folder_button = tk.Button(root, text="Выбрать папку", command=select_folder) select_folder_button.grid(row=2, column=2) search_button = tk.Button(root, text="Начать поиск", command=start_search) search_button.grid(row=3, column=1) paste_button = tk.Button(root, text="Вставить из буфера", command=paste_from_clipboard) paste_button.grid(row=1, column=2) result_text = tk.StringVar() result_label = tk.Label(root, textvariable=result_text) result_label.grid(row=4, column=1) root.mainloop() Для тех кто не умеет нормально запускать питон скрипты: создайте батник @echo off python путь\до_скрипта\zaprosi.py Code @echo off python путь\до_скрипта\zaprosi.py Чуть позже будет добавлены: -Работа с несколькими файлами или одним в папке (отдельная кнопка) -Нормальная работа с клавиатурой и окном "Запросы" -Удаление дубликатов и/или удаление unknown строк (отдельные кнопки) -Удалять url (отдельная кнопка), но корректно будет работать только с форматом url:log:pass -Выбор в какой кодировке софт будет прочитывать txt (лично для меня проблема, т.к. софт с помощью которого я удалял дубли в непонятную кодировку приводил итоговый файл) Если какие то пожелания есть - пишите, добавлю