web-dev-qa-db-fra.com

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

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

134
Shriram

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='')
169
jfs

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.

198
Jack Aidley

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.

45
Neamerjell

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()
39
Jayram Singh

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.

2
icktoofay

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
LiPi

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)
1
Yuya Takashina

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 ()
1
Zelmik
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!!!')
1
Vinit Pillai

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
RJay khadka

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)
0
iknowitwasyoufredo

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

(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

0
MisterL2