Есть моменты, когда нужно читать файл, на лету обрабатывать строки и сразу писать в другой файл одновременно.
Это позволяет сделать оператор менеджера контекста with
. Подготовим файл, который будем читать, изменять строки и сразу же писать новые данные в новый файл.
>>> text = 'Строка №1\nСтрока №2\nСтрока №3\n\ ... Строка №4\nСтрока №5\nСтрока №6\nСтрока №7\n\ ... Строка №8\nСтрока №9\nСтрока №10' >>> with open('foo.txt', 'w') as fp: ... fp.write(text)
Теперь будем читать построчно, менять слово "Строка" на слово "Линия -" и сразу же записывать изменения в файл new_foo.txt
. Файл new_foo.txt
нам создаст функции open()
с символом 'w'
для аргумента mode
.
>>> read_file = 'foo.txt' >>> write_file = 'new_foo.txt' >>> with open(read_file, 'r') as fr, open(write_file, 'w') as fw: ... for line in fr: ... line = line.replace('Строка', 'Линия -') ... fw.write(line)
Прочитаем созданный файл new_foo.txt
:
>>> read_file = 'new_foo.txt' >>> with open(read_file, 'r') as fr: ... for line in fr: ... print(line, end='') ... # Линия - №1 # Линия - №2 # Линия - №3 # Линия - №4 # Линия - №5 # Линия - №6 # Линия - №7 # Линия - №8 # Линия - №9 # Линия - №10
Для обработки файлов в несколько потоков смотрите модуль threading
.
Для решения данной задачи используем модуль стандартной библиотеки fileinput
.
Для избежания рекурсивного чтения-записи, при отборе файлов из исходного каталога по маске '.txt'
, создаваемому общему файлу дано расширение .all, а не .txt.
import fileinput, pathlib # каталог текстовых файлов # измените на свой pth = '/path/to/txt/files' # маска поиска файлов по расширению pattern = '*.txt' files_path = pathlib.Path(pth) list_files = files_path.glob(pattern) # общий файл, создадим в текущем каталоге new_file = 'new_file.all' if list_files: 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') # пишем данные fw.write(line)
Конечно, можно решить эту задачу без использования модуля fileinput
, но на обработку файлов будет затрачено больше времени.