Очередная тренировка работы с кодировками, поиском слов. И немного про пути к файлам (os, os.path), есть пример использования исключений (try, except).
# Задание # мне нужно отыскать файл среди десятков других # я знаю некоторые части этого файла (на память или из другого источника) # я ищу только среди .sql файлов # 1. программа ожидает строку, которую будет искать (input()) # после того, как строка введена, программа ищет её во всех файлах # выводит список найденных файлов построчно # выводит количество найденных файлов # 2. снова ожидает ввод # поиск происходит только среди найденных на этапе 1 # 3. снова ожидает ввод # ... # Выход из программы программировать не нужно. # Достаточно принудительно остановить, для этого можете нажать Ctrl + C # Пример на настоящих данных # python3 find_procedure.py # Введите строку: INSERT # ... большой список файлов ... # Всего: 301 # Введите строку: APPLICATION_SETUP # ... большой список файлов ... # Всего: 26 # Введите строку: A400M # ... большой список файлов ... # Всего: 17 # Введите строку: 0.0 # Migrations/000_PSE_Application_setup.sql # Migrations/100_1-32_PSE_Application_setup.sql # Всего: 2 # Введите строку: 2.0 # Migrations/000_PSE_Application_setup.sql # Всего: 1 # не забываем организовывать собственный код в функции import os import chardet migrations = 'Migrations' current_dir = os.path.dirname(os.path.abspath(__file__)) def all_list(): 'Формируем полный список файлов' migrations_dir = os.path.join(current_dir, migrations) file_list = os.listdir(path=migrations_dir) return file_list def sql_list(all_list): 'Функция для отбора sql-файлов' sql_file_list = list() # пустой список sql-файлов for i in all_list: if i.endswith('.sql'): sql_file_list.append(i) return sql_file_list def decode_files(file_name): 'Раскодирует файл, возвращает содержимое в читаемом виде' with open(os.path.join(current_dir, migrations, file_name), 'rb') as f: data = f.read() result = chardet.detect(data) data = data.decode(result['encoding']) data = data.lower() return data def search_string(sql_list): 'Главная функция: ищет запрашиваемую строку в файлах, список при каждом запросе сужается' file_list = sql_list while True: search = input('Введите строку (регистр не важен): ') search = search.lower() containing_files = list() # пустой список файлов для формирования сужающегося списка for file_name in file_list: if search in decode_files(file_name): containing_files.append(file_name) print(file_name) print('Всего: {}'.format(len(containing_files))) file_list = containing_files if __name__ == '__main__': search_string(sql_list(all_list())) pass