Comment rechercher et remplacer du texte dans un fichier en utilisant Python?

Comment rechercher et remplacer du texte dans un fichier en utilisant Python 3?

Voici mon code:

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

Fichier d’entrée:

salut c’est abcd salut c’est abcd

Ceci est un fichier texte factice.

C’est ainsi que la recherche et le remplacement des œuvres abcd

Lorsque je recherche et remplace “ram” par “abcd” dans le fichier d’entrée ci-dessus, cela fonctionne comme un charme. Mais quand je le fais vice-versa, c’est-à-dire remplacer «abcd» par «ram», certains caractères indésirables sont laissés à la fin.

Remplacer “abcd” par “ram”

salut c’est ram salut c’est ram

Ceci est un fichier texte factice.

Voici comment rechercher et remplacer des œuvres rambcd

fileinput supporte déjà l’édition en place. Il redirige stdout vers le fichier dans ce cas:

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

Comme indiqué par michaelb958, vous ne pouvez pas remplacer en place par des données de longueur différente, car cela mettrait les autres sections hors de propos. Je ne suis pas d’accord avec les autres affiches suggérant de lire un fichier et d’écrire à un autre. Au lieu de cela, je lisais le fichier en mémoire, corrigeais les données, puis les écrivais dans le même fichier dans une étape distincte.

 # Read in the file with open('file.txt', 'r') as file : filedata = file.read() # Replace the target ssortingng filedata = filedata.replace('ram', 'abcd') # Write the file out again with open('file.txt', 'w') as file: file.write(filedata) 

À moins que vous ne disposiez d’un fichier volumineux trop volumineux pour être chargé en mémoire en une fois.

Comme l’a signalé Jack Aidley et JF Sebastian, ce code ne fonctionnera pas:

  # Read in the file filedata = None with file = open('file.txt', 'r') : filedata = file.read() # Replace the target ssortingng filedata.replace('ram', 'abcd') # Write the file out again with file = open('file.txt', 'w') : file.write(filedata)` 

Mais ce code fonctionnera (je l’ai testé):

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

En utilisant cette méthode, filein et fileout peuvent être le même fichier, car Python 3.3 écrasera le fichier lors de son ouverture en écriture.

Vous pouvez faire le remplacement comme ça

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

Votre problème provient de la lecture et de l’écriture dans le même fichier. Plutôt que d’ouvrir fileToSearch pour l’écriture, ouvrez un fichier temporaire réel, puis après avoir fermé tempFile , utilisez os.rename pour déplacer le nouveau fichier sur fileToSearch .

Ma variante, un mot à la fois sur l’ensemble du fichier.

Je le lis en mémoire.

 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) 

Je l’ai fait:

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

Je recommande son intérêt à vérifier ce petit programme. Les expressions régulières sont la voie à suivre.

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

J’ai modifié légèrement le post de Jayram Singh afin de remplacer toutes les instances d’un ‘!’ caractère à un nombre que je voulais incrémenter à chaque instance. Je pensais que cela pourrait être utile pour quelqu’un qui voulait modifier un caractère qui se produisait plus d’une fois par ligne et souhaitait l’itérer. J’espère que ça aide quelqu’un. PS- Je suis très novice en matière de codage. Je m’excuse si mon message est inapproprié, mais cela a fonctionné pour moi.

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