Ищите и замените строку в файле в Python

#define stringify( name ) # name

enum MyEnum {
    ENUMVAL1
};
...stuff...

stringify(EnumName::ENUMVAL1);  // Returns MyEnum::ENUMVAL1

Дальнейшее обсуждение этого метода

Приводы препроцессора для новичков

270
задан SilentGhost 6 September 2009 в 23:11
поделиться

7 ответов

Я предполагаю, что что-то вроде этого должно сделать это. Это в основном пишет содержание в новый файл и заменяет старый файл новым файлом:

from tempfile import mkstemp
from shutil import move
from os import fdopen, remove

def replace(file_path, pattern, subst):
    #Create temp file
    fh, abs_path = mkstemp()
    with fdopen(fh,'w') as new_file:
        with open(file_path) as old_file:
            for line in old_file:
                new_file.write(line.replace(pattern, subst))
    #Remove original file
    remove(file_path)
    #Move new file
    move(abs_path, file_path)
180
ответ дан Alex S 23 November 2019 в 02:18
поделиться

Самый короткий путь состоял бы в том, чтобы, вероятно, использовать fileinput модуль . Например, следующее добавляет номера строки к файлу, оперативному:

import fileinput

for line in fileinput.input("test.txt", inplace=True):
    print "%d: %s" % (fileinput.filelineno(), line),

, Что происходит, вот:

  1. исходный файл перемещен в файл резервной копии
  2. , стандартный вывод перенаправляется в исходный файл в цикле
  3. Таким образом любой print, операторы записывают обратно в исходный файл

fileinput, имеет больше дополнительных свойств. Например, это может использоваться для автоматической работы на все файлы в sys.args[1:] без того, что вы имели необходимость выполнить итерации по ним явно. При запуске с Python 3.2 это также предоставляет удобному менеджеру по контексту для использования в with оператор.

<час>

, В то время как fileinput является большим для холостых сценариев, я опасался бы использовать его в реальном коде, потому что по общему признанию это не очень читаемо или знакомо. В реальном (производство) кодируют, стоит потратить еще всего несколько строк кода, чтобы сделать процесс явным и таким образом сделать код читаемым.

существует две опции:

  1. файл не является чрезмерно большим, и можно просто считать его полностью в память. Тогда закройте файл, вновь откройте его в записи режима и запишите измененное содержание обратно.
  2. файл является слишком большим, чтобы быть сохраненным в памяти; можно переместить его во временный файл и открытый что, читая его линию за линией, записав обратно в исходный файл. Обратите внимание, что это требует дважды устройства хранения данных.
248
ответ дан Julian 23 November 2019 в 02:18
поделиться

Вот другой пример, который был протестирован и будет соответствовать поиску & шаблоны замены:

import fileinput
import sys

def replaceAll(file,searchExp,replaceExp):
    for line in fileinput.input(file, inplace=1):
        if searchExp in line:
            line = line.replace(searchExp,replaceExp)
        sys.stdout.write(line)

использование В качестве примера:

replaceAll("/fooBar.txt","Hello\sWorld!$","Goodbye\sWorld.")
73
ответ дан the Tin Man 23 November 2019 в 02:18
поделиться

Как lassevk предполагает, выпишите новый файл, когда Вы идете, вот некоторый пример кода:

fin = open("a.txt")
fout = open("b.txt", "wt")
for line in fin:
    fout.write( line.replace('foo', 'bar') )
fin.close()
fout.close()
11
ответ дан hamishmcn 23 November 2019 в 02:18
поделиться

Создайте новый файл, скопируйте строки от старого до нового, и сделайте замену перед записью строк в новый файл.

3
ответ дан angry person 23 November 2019 в 02:18
поделиться

fileinput довольно просто, как упомянуто на предыдущих ответах:

import fileinput

def replace_in_file(file_path, search_text, new_text):
    with fileinput.input(file_path, inplace=True) as f:
        for line in f:
            new_line = line.replace(search_text, new_text)
            print(new_line, end='')

Объяснение:

  • fileinput может принять несколько файлов, но я предпочитаю закрывать каждый единственный файл, как только он обрабатывается. Так поместил единственный file_path в with оператор.
  • print оператор ничего не печатает, когда inplace=True, потому что STDOUT передается исходному файлу.
  • end='' в [1 110] оператор должен устранить промежуточные пустые новые строки.

Может использоваться следующим образом:

file_path = '/path/to/my/file'
replace_in_file(file_path, 'old-text', 'new-text')
0
ответ дан 23 November 2019 в 02:18
поделиться

Это должно работать: (редактирование на месте)

import fileinput

# Does a list of files, and
# redirects STDOUT to the file in question
for line in fileinput.input(files, inplace = 1): 
      print line.replace("foo", "bar"),
61
ответ дан 23 November 2019 в 02:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: