/
luvpython
/
homework-file
Обзор
Документация
Войти
/
luvpython
/
homework-file
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Task 3.py
127 строк
7 KB
MAXIM
second commit
29 апр 2026, 20:12
29 апр 2026, 20:12
994f487
Код
Авторство
О чём код?
# def merge_files_by_line_count(file_list, output_file='result.txt'): # # # # Шаг 1: Создаём пустой список, куда будем складывать информацию о каждом файле # files_data = [] # # # Шаг 2: Перебираем все файлы из переданного списка # for filename in file_list: # try: # # Открываем текущий файл для чтения # with open(filename, 'r', encoding='utf-8') as f: # # Читаем все строки файла в список (каждая строка — элемент списка) # lines = sum(1 for _ in f) # # # # # Добавляем в общий список словарь с информацией об этом файле: # # - имя файла # # - количество строк # # - само содержимое # files_data.append({ # 'filename': filename, # 'line_count': line_count, # 'content': content # }) # # except FileNotFoundError: # # Если файл не найден — выводим сообщение и пропускаем его (программа не упадёт) # print(f"Файл '{filename}' не найден — пропускаем.") # continue # # # Шаг 3: Определяем функцию, которая будет использоваться для сортировки # # Она принимает один элемент списка (словарь с инфо о файле) и возвращает количество строк # def get_line_count(file_info): # return file_info['line_count'] # # # Шаг 4: Сортируем список файлов по количеству строк (по возрастанию) # # Используем нашу функцию get_line_count вместо lambda # files_data.sort(key=get_line_count) # # # Шаг 5: Открываем итоговый файл для записи # with open(output_file, 'w', encoding='utf-8') as out: # # Перебираем отсортированный список файлов # for file_info in output_file: # # Пишем первую строку заголовка: имя файла # out.write(file_info['filename'] + '\n') # # # Пишем вторую строку заголовка: количество строк в файле # out.write(str(file_info['line_count']) + '\n') # # # Пишем само содержимое файла (как есть, с переносами строк) # out.write(file_info['content']) # # # После каждого блока добавляем пустую строку (как в примере задания) # out.write('\n') # # # Шаг 6: Выводим сообщение, что всё готово # print(f"Готово! Результат записан в файл: {output_file}") # # # # === Запуск программы === # if __name__ == '__main__': # # Указываем имена файлов, которые нужно объединить # files_to_merge = ['1.txt', '2.txt'] # # # Вызываем функцию и указываем имя выходного файла # merge_files_by_line_count(files_to_merge, 'result.txt') def merge_files_by_line_count(file_list, output_file='result.txt'): # Шаг 1: Создаём список только с мета-данными (имя и кол-во строк) # Это занимает мало памяти, даже если файлы огромные files_meta = [] for filename in file_list: try: with open(filename, 'r', encoding='utf-8') as f: # Считаем количество строк, не сохраняя само содержимое в память line_count = sum(1 for _ in f) files_meta.append({ 'filename': filename, 'line_count': line_count }) except FileNotFoundError: print(f"Файл '{filename}' не найден — пропускаем.") continue # Если после проверок не осталось файлов, выходим if not files_meta: print("Нет файлов для обработки.") return # Шаг 2: Сортируем список мета-данных по количеству строк # Используем lambda для краткости, можно вынести в отдельную функцию как у вас files_meta.sort(key=lambda x: x['line_count']) # Шаг 3: Открываем итоговый файл и записываем данные with open(output_file, 'w', encoding='utf-8') as out: for meta in files_meta: # Исправлено: итерируемся по files_meta, а не output_file filename = meta['filename'] line_count = meta['line_count'] # Пишем заголовки out.write(f"{filename}\n") out.write(f"{line_count}\n") # Теперь читаем исходный файл построчно и сразу пишем в результат # Это экономит оперативную память try: with open(filename, 'r', encoding='utf-8') as src: for line in src: out.write(line) except FileNotFoundError: # Теоретически невозможно, так как мы уже проверили наличие выше, # но на всякий случай оставим обработку print(f"Ошибка чтения файла {filename} во время записи.") continue # Добавляем пустую строку после содержимого каждого файла out.write('\n') print(f"Готово! Результат записан в файл: {output_file}") # === Запуск программы === if __name__ == '__main__': files_to_merge = ['1.txt', '2.txt'] merge_files_by_line_count(files_to_merge, 'result.txt')