#python #file #python-3.x
#python #файл #python-3.x
Вопрос:
Я не знаю, должно ли это быть очевидным для более технически подкованных среди нас, но есть ли конкретный способ прочитать строку из текстового файла, затем отредактировать ее и вставить обратно в файл в исходное местоположение? Я посмотрел на сайте, но все решения, которые я нахожу, похоже, для python 2.7.
Ниже приведен пример того, что я ищу:
with open example.txt as file:
for line in file:
if myline in file:
file.edit("foo","fah")
Комментарии:
1. Вы имеете в виду, что вам нужно заменить все вхождения
foo
на сfah
?2. Нет только в конкретной строке
Ответ №1:
В 95% случаев замена данных (например, текста) в файле обычно означает
- Считывайте файл по частям, например, построчно
- Отредактируйте фрагмент
- Запишите отредактированный фрагмент в новый файл
- Замените старый файл новым файлом.
Итак, простой код будет:
import os
with open(in_path, 'r') as fin:
with open(temp_path, 'w') as fout:
for line in fin:
line.replace('foo', 'fah')
fout.write(line)
os.rename(temp_path, in_path)
Почему бы не заменить их на месте? Ну, файл — это фиксированная последовательность байтов, и единственный способ ее увеличить — это добавить в конец файла. Теперь, если вы хотите заменить данные той же длины — никаких проблем. Однако, если длина исходной и новой последовательностей отличается, возникает проблема: новая последовательность будет перезаписывать следующие символы. Например.
original: abc hello abc world
replace abc -> 12345
result: 12345ello 12345orld
Ответ №2:
Вы могли бы сделать это с помощью fileinput
with inplace
passed . Вы все равно не можете просто выполнить однострочное редактирование, вы значительно условно меняете нужную вам строку и оставляете все остальное как есть.
Короче говоря, с файлом, похожим на:
$ head example.txt
pass
pass
foo
pass
Вы могли бы сделать:
import fileinput
with fileinput.input('example.txt', inplace=True) as f:
for line in f:
print('fah' if 'foo' in line else line.strip())
Для получения результата:
$ head example.txt
pass
pass
fah
pass