Como pesquisar e replace texto em um arquivo usando Python?

Como faço para pesquisar e replace texto em um arquivo usando o Python 3?

Aqui está o meu código:

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

Arquivo de input:

oi isso é abcd oi isso é abcd

Este é um arquivo de texto falso.

É assim que a pesquisa e substituição funciona abcd

Quando eu procuro e substituo ‘ram’ por ‘abcd’ no arquivo de input acima, ele funciona como um encanto. Mas quando eu faço isso, vice-versa, ou seja, substituindo ‘abcd’ por ‘ram’, alguns personagens inúteis são deixados no final.

Substituindo ‘abcd’ por ‘ram’

oi isso é ram ​​oi isso é ram

Este é um arquivo de texto falso.

É assim que a pesquisa e substituição funciona

    fileinput já suporta edição no local. Ele redireciona o stdout para o arquivo neste caso:

     #!/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='') 

    Como apontado por michaelb958, você não pode replace no lugar com dados de um comprimento diferente, porque isso irá colocar o resto das seções fora do lugar. Não concordo com os outros cartazes sugerindo que você leia de um arquivo e escreva para outro. Em vez disso, gostaria de ler o arquivo na memory, corrigir os dados e, em seguida, gravá-lo no mesmo arquivo em uma etapa separada.

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

    A menos que você tenha um arquivo enorme para trabalhar com o qual é muito grande para carregar na memory de uma só vez.

    Como Jack Aidley havia postado e JF Sebastian apontou, este código não funcionará:

      # 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)` 

    Mas este código funcionará (eu testei):

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

    Usando este método, filein e fileout podem ser o mesmo arquivo, porque o Python 3.3 sobrescreve o arquivo na abertura para gravação.

    Você pode fazer a substituição assim

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

    Seu problema decorre da leitura e gravação no mesmo arquivo. Em vez de abrir fileToSearch para gravação, abra um arquivo temporário real e, depois de terminar e ter o tempFile fechado, use os.rename para mover o novo arquivo para fileToSearch .

    Minha variante, uma palavra por vez no arquivo inteiro.

    Eu li isso na memory.

     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) 

    Eu fiz isso:

     #!/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 () 

    Eu recomendo que vale a pena conferir este pequeno programa. Expressões regulares são o caminho a percorrer.

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

    Eu modifiquei ligeiramente a postagem de Jayram Singh para replace cada instância de um ‘!’ personagem para um número que eu queria incrementar com cada instância. Pensei que poderia ser útil para alguém que quisesse modificar um personagem que ocorresse mais de uma vez por linha e quisesse iterar. Espero que ajude alguém. PS- Eu sou muito novo na codificação, então peço desculpas se meu post é inapropriado de alguma forma, mas isso funcionou para mim.

     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 (localizar, replace):

     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)