Вопрос-Ответ

How to search and replace text in a file

Как искать и заменять текст в файле

Как выполнить поиск и замену текста в файле с помощью Python 3?

Вот мой код:

import os
import sys
import fileinput

print("Text to search for:")
textToSearch = input("> ")

print("Text to replace it with:")
textToReplace = input("> ")

print("File to perform Search-Replace on:")
fileToSearch = input("> ")

tempFile = open(fileToSearch, 'r+')

for line in fileinput.input(fileToSearch):
if textToSearch in line:
print('Match Found')
else:
print('Match Not Found!!')
tempFile.write(line.replace(textToSearch, textToReplace))
tempFile.close()

input('\n\n Press Enter to exit...')

Входной файл:

hi this is abcd hi this is abcd
This is dummy text file.
This is how search and replace works abcd

Когда я ищу и заменяю 'ram' на 'abcd' во входном файле выше, это работает как по волшебству. Но когда я делаю это наоборот, т. Е. Заменяю 'abcd' на 'ram', в конце остаются некоторые ненужные символы.

Замена 'abcd' на 'ram':

hi this is ram hi this is ram
This is dummy text file.
This is how search and replace works rambcd
Переведено автоматически
Ответ 1

Как указал michaelb958, вы не можете заменить на месте данными другой длины, потому что это поставит остальные разделы не на свои места. Я не согласен с другими плакатами, предлагающими читать из одного файла и записывать в другой. Вместо этого я бы прочитал файл в память, исправил данные, а затем записал их в тот же файл отдельным шагом.

# Read in the file
with open('file.txt', 'r') as file:
filedata = file.read()

# Replace the target string
filedata = filedata.replace('abcd', 'ram')

# Write the file out again
with open('file.txt', 'w') as file:
file.write(filedata)

Если только у вас нет большого файла для работы, который слишком велик, чтобы загрузить его в память за один раз, или вы обеспокоены потенциальной потерей данных, если процесс будет прерван на втором этапе, на котором вы записываете данные в файл.

Ответ 2

fileinput уже поддерживает редактирование на месте. В данном случае оно перенаправляет stdout на файл:

#!/usr/bin/env python3
import fileinput

with fileinput.FileInput(filename, inplace=True, backup='.bak') as file:
for line in file:
print(line.replace(text_to_search, replacement_text), end='')
Ответ 3

Как написал Джек Эйдли и указал jfs, этот код работать не будет:

# Read in the file
filedata = None
with file = open('file.txt', 'r') :
filedata = file.read()

# Replace the target string
filedata.replace('ram', 'abcd')

# Write the file out again
with file = open('file.txt', 'w') :
file.write(filedata)`

Но этот код будет работать (я его тестировал):

f = open(filein,'r')
filedata = f.read()
f.close()

newdata = filedata.replace("old data","new data")

f = open(fileout,'w')
f.write(newdata)
f.close()

Используя этот метод, filein и fileout могут быть одним и тем же файлом, потому что Python 3.3 перезапишет файл при открытии для записи.

Ответ 4

Вы можете выполнить замену следующим образом

f1 = open('file1.txt', 'r')
f2 = open('file2.txt', 'w')
for line in f1:
f2.write(line.replace('old_text', 'new_text'))
f1.close()
f2.close()
python python-3.x string file