В примере будем искать все файлы, расположенные в директории 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)