Comment rechercher et remplacer du texte dans un fichier à l'aide de 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.
Voici comment rechercher et remplacer des travaux abcd
Lorsque je recherche et remplace "ram" par "abcd" dans le fichier d'entrée ci-dessus, cela fonctionne comme un charme. Mais lorsque je le fais inversement, c'est-à-dire en remplaçant "abcd" par "ram", il reste quelques caractères indésirables.
Remplacement de 'abcd' par 'ram'
salut c'est ram salut c'est c'est ram
Ceci est un fichier texte factice.
Voici comment fonctionne la recherche et le remplacement
fileinput
prend déjà en charge la modification en place. Dans ce cas, il redirige stdout
vers le fichier:
#!/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 l'a souligné michaelb958, vous ne pouvez pas remplacer les données 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 qui vous suggèrent de lire d'un fichier et d'écrire dans un autre. Au lieu de cela, je lisais le fichier en mémoire, je corrigeais les données, puis je l'écrivais dans le même fichier à une étape distincte.
# 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)
À moins que vous n'ayez à travailler avec un fichier volumineux, qui est trop volumineux pour être chargé en mémoire en une fois.
Comme Jack Aidley l'avait signalé et souligné par J.F. Sebastian, ce code ne fonctionnerait pas:
# 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)`
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()
Avec 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
en écriture, ouvrez un fichier temporaire, puis après avoir terminé et 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 l'ai lu 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)
Vous pouvez également utiliser pathlib
.
from pathlib2 import Path
path = Path(file_to_search)
text = path.read_text()
text = text.replace(text_to_search, replacement_text)
path.write_text(text)
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 ()
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!!!')
Je recommande sa peine de vérifier ce petit programme. Les expressions régulières sont la voie à suivre.
https://github.com/khranjan/pythonprogramming/tree/master/findandreplace
Avec un seul bloc, vous pouvez rechercher et remplacer votre texte:
with open('file.txt','r+') as f:
filedata = f.read()
filedata = filedata.replace('abc','xyz')
f.truncate(0)
f.write(filedata)
J'ai légèrement modifié le post de Jayram Singh afin de remplacer chaque occurrence d'un "!" caractère à un nombre que je voulais incrémenter avec chaque instance. Je pensais que cela pourrait être utile à quelqu'un qui souhaite modifier un personnage qui se produit plus d'une fois par ligne et qui souhaite itérer. J'espère que ça aide quelqu'un. PS- Je suis très novice en matière de codage, donc 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()
(pip installer python-util)
from pyutil import filereplace
filereplace("somefile.txt","abcd","ram")
Le deuxième paramètre (la chose à remplacer, par exemple "abcd" peut également être une expression régulière)
Remplacera toutes les occurrences