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



Как найти и заменить текст в файл с помощью 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( "> " )
#fileToSearch = 'D:dummy1.txt'

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( 'nn Press Enter to exit...' )


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




привет это abcd привет это abcd



это фиктивный текстовый файл.



вот как работает поиск и замена abcd




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



замена 'abcd' на 'ram'




привет это рам привет это рам



это фиктивный текстовый файл.



вот как работает поиск и замена rambcd


5295   14  

14 ответов:

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='')

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

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

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

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

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

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

 # 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 перезапишет файл при открытии для записи.

вы можете сделать замену, как это

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()

ваша проблема связана с чтением и записью в один и тот же файл. Вместо того, чтобы открыть fileToSearch для записи откройте фактический временный файл, а затем после того, как вы закончите и закроете tempFile используйте os.rename, чтобы переместить новый файл fileToSearch.

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

Я прочитал его в памяти.

def replace_word(infile,old_word,new_word):
    if not os.path.isfile(infile):
        print ("Error on replace_word, not a regular file: "+infile)
        sys.exit(1)

    f1=open(infile,'r').read()
    f2=open(infile,'w')
    m=f1.replace(old_word,new_word)
    f2.write(m)

Я сделал так:

#!/usr/bin/env python3

import fileinput
import os

Dir = input ("Source directory: ")
os.chdir(Dir)

Filelist = os.listdir()
print('File list: ',Filelist)

NomeFile = input ("Insert file name: ")

CarOr = input ("Text to search: ")

CarNew = input ("New text: ")

with fileinput.FileInput(NomeFile, inplace=True, backup='.bak') as file:
    for line in file:
        print(line.replace(CarOr, CarNew), end='')

file.close ()

Я рекомендую его стоит проверить это небольшая программа. Регулярные выражения-это путь.

https://github.com/khranjan/pythonprogramming/tree/master/findandreplace

Я немного изменил сообщение Jayram Singh, чтобы заменить каждый экземпляр a'!'символ к числу, которое я хотел увеличить с каждым экземпляром. Подумал, что это может быть полезно для тех, кто хочет изменить символ, который произошел более одного раза в строке и хотел повторить. Надеюсь, это кому-то поможет. PS-Я очень новичок в кодировании, поэтому извиняюсь, если мой пост неуместен в любом случае, но это сработало для меня.

f1 = open('file1.txt', 'r')
f2 = open('file2.txt', 'w')
n = 1  

# if word=='!'replace w/ [n] & increment n; else append same word to     
# file2

for line in f1:
    for word in line:
        if word == '!':
            f2.write(word.replace('!', f'[{n}]'))
            n += 1
        else:
            f2.write(word)
f1.close()
f2.close()
def word_replace(filename,old,new):
    c=0
    with open(filename,'r+',encoding ='utf-8') as f:
        a=f.read()
        b=a.split()
        for i in range(0,len(b)):
            if b[i]==old:
                c=c+1
        old=old.center(len(old)+2)
        new=new.center(len(new)+2)
        d=a.replace(old,new,c)
        f.truncate(0)
        f.seek(0)
        f.write(d)
    print('All words have been replaced!!!')

def findReplace (найти, заменить):

import os 

src = os.path.join(os.getcwd(), os.pardir) **`//To get the folder in which files are present`** 

for path, dirs, files in os.walk(os.path.abspath(src)):

    for name in files: 

        if name.endswith('.py'): 

            filepath = os.path.join(path, name)

            with open(filepath) as f: 

                s = f.read() 

            s = s.replace(find, replace) 

            with open(filepath, "w") as f:

                f.write(s) 

Comments

  1. Banberry
    Banberry 5 лет назад
    Озаботился той же проблемой, заменить разделы в .ini файле при запуске программы.
    Делать один раз и если уже есть .bak замену не повторять:

    <pre>
    <code>
    def replace_set(infile):
    # Замена старых разделов в конфиге 'SetXXXXXX' на 'Part_XXXXXX'

    old_word = 'Set'
    new_word = 'Part_'
    skip_word = 'Settings'

    if not os.path.isfile(infile):
    print ('File not found: ' + infile)
    return

    if os.path.isfile(infile + '.bak'):
    print ('Backup file alredy exist: ' + infile + '.bak')
    return

    try:
    os.rename(infile, infile + '.bak')
    except:
    print ('Error file backup.')
    return

    f1=open(infile + '.bak','r')
    filedata = f1.read().split('\n')
    f1.close()

    i = 0
    f2=open(infile,'w')
    for line in filedata:
    i += 1
    e = '\n' if i &lt; len(filedata) else ''
    if line.find(skip_word) == -1:
    m = line.replace(old_word, new_word) + e
    else:
    m = line + e
    f2.write(m)
    f2.close()
    </code></pre>

    Проверено, работает!
  2. Banberry
    Banberry 5 лет назад
    О какая мешанина получилась! А как же в этом блоге программный код выделять? Весь сайт перерыл, никакого описания, как правильно оформалять разделы или вставку кода.

    Извиняйте! Удалить свой ответ тоже никак!

    Ну а модератору просьба исправить и оформить пост выше по правильному.
    • sergeyzorg
      sergeyzorg 5 лет назад
      Исправили