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

120
demandé sur Paula Livingstone 2013-06-17 09:24:37

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='')
154
répondu jfs 2018-02-28 15:07:56

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.

164
répondu Jack Aidley 2017-02-21 09:34:07

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.

44
répondu Neamerjell 2014-04-05 05:19:15

, 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()
35
répondu Jayram Singh 2013-06-17 05:32:29

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.

2
répondu icktoofay 2013-06-17 05:43:36

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)
1
répondu LiPi 2013-12-15 10:19:22

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 ()
1
répondu Zelmik 2017-02-16 21:26:18

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

0
répondu RJay khadka 2016-08-25 19:18:56

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()
0
répondu Doc5506 2017-09-24 16:57:20
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!!!')
0
répondu Vinit Pillai 2018-01-23 18:45:54

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) 
-2
répondu gdeepak284 2018-06-20 10:11:27