Comment rechercher et remplacer du texte dans un fichier en utilisant Python?
Comment puis-je 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( 'nn Press Enter to exit...' )
Fichier d'Entrée:
Salut c'est abcd salut c'est abcd
C'est un fichier texte factice.
Voici comment rechercher et remplacer fonctionne 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 de remplacer "abcd" par "ram", certains caractères indésirables sont laissés à la fin.
Remplacement 'abcd' par 'ram'
Salut c'est ram Salut c'est ram
C'est un fichier texte factice.
Voici comment rechercher et remplacer fonctionne rambcd
11 réponses
fileinput
prend déjà en charge directe de l'édition. 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 avec des données d'une longueur différente car cela mettra le reste des sections hors de place. Je ne suis pas d'accord avec les autres affiches suggérant que vous lisez d'un fichier et écrivez à un autre. Au lieu de cela, je lirais le fichier en mémoire, corrigerais les données, puis l'écrirais 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 string
filedata = filedata.replace('ram', 'abcd')
# Write the file out again
with open('file.txt', 'w') as file:
file.write(filedata)
Sauf si vous avez un fichier massif pour travailler avec qui est trop grand pour charger en mémoire en une seule fois.
Comme Jack Aidley l'avait posté et J. F. Sebastian l'a souligné, ce code ne fonctionnera 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()
En utilisant cette méthode, filein et fileout peuvent être le même fichier, car Python 3.3 écrasera le fichier lors de l'ouverture en écriture.
, Vous pouvez faire le remplacement comme ceci
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 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)
J'ai fait ceci:
#!/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 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
J'ai légèrement modifié le message de Jayram Singh afin de remplacer chaque instance de '!'caractère à un nombre que je voulais incrémenter avec chaque instance. J'ai pensé que cela pourrait être utile à quelqu'un qui voulait modifier un caractère qui s'est produit plus d'une fois par ligne et qui voulait itérer. Espérons que l'aide à quelqu'un. PS-je suis très nouveau au codage, donc mes excuses si mon message est inapproprié de quelque façon que ce soit, 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 (Rechercher, Remplacer):
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)