Обмен определенными строками файла

#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% случаев замена данных (например, текста) в файле обычно означает

  1. Считывайте файл по частям, например, построчно
  2. Отредактируйте фрагмент
  3. Запишите отредактированный фрагмент в новый файл
  4. Замените старый файл новым файлом.

Итак, простой код будет:

 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