Сообщить об ошибке.

Объединение нескольких файлов в один, модуль fileinput Python

Отбираем файлы по маске и объединяем их содержимое в один

В примере будем искать все файлы, расположенные в директории path, совпадающие с паттерном pattern и записывать данные из всех найденных файлов в новый общий файл new_file.all. В общий файл будем дописывать строку с именем файла перед его объединением.

Внимание! Будьте осторожны, если будете читать файлы и записывать новый файл c расширением .txt в одно и то же место (каталог или директорию) особенно с паттерном '*.txt'. Это может привести к бесконечной рекурсии чтения и записи. Так как новый созданный файл с расширением .txt, в итоге, будет читать и писать сам себя!

Для этого в примере, новому общему файлу дано расширение .all, а не .txt. Вдруг кто-нибудь "скопипастит" и изменит каталог поиска файлов path на корневой, то рекурсии точно не избежать.

import fileinput, glob, os

# каталог текстовых файлов
# измените на свой
path = '/path/to/txt/files'
# паттерн поиска файлов по расширению
pattern = '*.txt'

glob_path = os.path.join(path, pattern)
list_files = glob.glob(glob_path)
# расширение нового файла установим как '.all'
new_file = 'new_file.all'

if list_files:
    # открываем список файлов 'list_files' на чтение 
    # и новый общий файл 'new_file' на запись
    with fileinput.FileInput(files=list_files) as fr, open(new_file, 'w') as fw:
        # читаем данные построчно
        for line in fr:
            # определяем первую строку нового файла
            if fr.isfirstline():
                # название читаемого файла
                file_name = fr.filename()
                # дописываем строку с названием файла
                fw.write(f'\n\n------------ {file_name}\n\n')

            # если нужно, то здесь обрабатываем каждую строку 'line' 
            # после обработки дописываем в общий файл
            fw.write(line)

Больше об управлении потоком чтения списка файлов читайте в разделе "Управление чтением списка файлов модуля fileinput".

То же самое можно сделать и без модуля fileinput, но будет работать чуть дольше по времени и потреблять больше ресурсов.

import glob, os

# каталог текстовых файлов
# измените на свой
path = '/path/to/txt/files'
# паттерн поиска файлов по расширению
pattern = '*.txt'

glob_path = os.path.join(path, pattern)
list_files = glob.glob(glob_path)
# расширение нового файла установим как '.all'
new_file = 'new_file.all'

# чтение и запись
if list_files:
    for file_name in list_files:
        # открываем файл из 'list_files' на чтение 
        # а новый общий файл 'new_file' на дозапись
        with open(file_name, 'r') as fr, open(new_file, 'a') as fw:
            # дописываем строку с названием файла
            fw.write(f'\n\n------------ {file_name}\n\n')

            # читаем данные построчно
            for line in fr:
                # если нужно, то здесь обрабатываем каждую строку 'line' 
                # после обработки дописываем в общий файл
                fw.write(line)