Comment rechercher et remplacer du texte dans un fichier?
Comment puis-je 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:
hi this is abcd hi this is abcd
This is dummy text file.
This is how search and replace works abcd
Quand je fais une recherche et remplacer 'ram' par 'abcd' ci-dessus dans le fichier d'entrée, il 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.
En remplaçant 'abcd' par 'ram'
hi this is ram hi this is ram
This is dummy text file.
This is how search and replace works rambcd
- Pouvez-vous être un peu plus précis quand tu dis "certains caractères indésirables sont laissés à la fin", que voyez-vous?
- Mise à jour à la question de la sortie de ce que j'ai.
- modifier le fichier texte à l'aide de Python
Vous devez vous connecter pour publier un commentaire.
fileinput
prend déjà en charge directe de l'édition. Il redirigestdout
pour le fichier, dans ce cas:end=''
argument censé faire?line
a déjà un retour à la ligne.end
est un retour à la ligne par défaut,end=''
faitprint()
fonction ne pas imprimer plus de saut de lignefileinput
n'est pas un outil pour tous emplois (rien), mais il existe de nombreux cas où il est le droit de l'outil par exemple, pour mettre en œuvre unsed
-comme filtre en Python. N'utilisez pas de tournevis pour marteler les clous.fileinput
n' (en gros, l'utilisationtry..finally
ou un contextmanager pour vous assurer que vous définissez stdout retour à la valeur initiale après). Le code source pourfileinput
est assez œil-bleedingly terrible, et il fait vraiment dangereux choses sous le capot. S'il avait été écrit aujourd'hui, je doute fort qu'il aurait fait dans la stdlib.end=""
est une solution de nettoyage.open('file', 'wb').write(b'\r\n\n\r')
, ne rechercher/remplacer à l'aide du code dans la réponse, et d'afficher les résultats inattendus (le cas échéant)(print(ascii(open('file', 'rb').read()))
) ainsi que les résultats attendus d'une nouvelle question.for filename in __files__:
\n tmp_name = nom de fichier + '.modifié"\n avec les codecs.open(filename, "r", encoding= "latin-1") que fi, \ codecs.ouvert(tmp_name, 'w', encoding= "latin-1") comme fo: pour ligne en fi: new_line = ligne.remplacer(oldv,newv) fo.écrire(new_line) os.supprimer(nom de fichier) os.renommer(tmp_name, le nom de fichier)codecs.open
, utilisezio.open
à la place.sub()
méthode dere
module, découvrez ma réponse à cette question fonctionne totalement.end=''
, vous pouvez utiliserfrom __future__ import print_function
ou à tout le moins utiliser.rstrip('\n')
au lieu de.rstrip()
, pour éviter de retirer trop les espaces de la ligne.with open(os.path.join(path,file), "r", encoding = "utf-8") as file:
d'ouvrir le fichier et éviter UnicodeDecodeError mais dans le cas ci-dessus deFileInput(filename, inplace=True, backup='.bak')
comment suis-je suppose que pour éviter que commenter cela.Comme l'a souligné michaelb958, vous ne pouvez pas remplacer en place avec les données de longueur différente, car cela permettra de mettre le reste des sections de la place. Je suis en désaccord avec les autres affiches vous suggère de lire à partir d'un fichier et écrire à l'autre. Au lieu de cela, je voudrais lire le fichier dans la mémoire, de corriger les données, puis l'écrire dans le même fichier dans une étape distincte.
Sauf si vous avez un fichier énorme de travailler avec ce qui est trop grand pour charger en mémoire un aller, ou vous êtes préoccupé par la perte de données potentielle si le processus est interrompu au cours de la deuxième étape de l'écriture de données sur le fichier.
with file = open(..):
n'est pas valide Python (=
) si l'intention est claire..replace()
ne modifie pas la chaîne (c'est immuable) si vous avez besoin d'utiliser la valeur retournée. De toute façon le code qui prend en charge les gros fichiers, peut être encore plus simple sauf si vous avez besoin de rechercher et de remplacer du texte qui s'étend sur plusieurs lignes.file.close()
with
déclaration ferme automatiquement le fichier à la fin du bloc d'instructions.Comme Jack Aidley avait posté et J. F. Sebastian l'a souligné, ce code ne fonctionnera pas:
Mais ce code fonctionne (j'ai testé):
À l'aide de cette méthode, filein et fileout peut être le même fichier, parce que Python 3.3 remplace le fichier lors de l'ouverture pour l'écriture.
with
-déclaration? 2. Comme indiqué dans ma réponse,fileinput
peut fonctionner en place, il peut remplacer les données dans le même fichier (il utilise un fichier temporaire en interne). La différence est quefileinput
n'a pas besoin de charger tout le fichier en mémoire.with
blocs).Vous pouvez faire le remplacement comme ce
Vous pouvez également utiliser
pathlib
.Que votre problème vient de la lecture et l'écriture sur le même fichier. Plutôt que d'ouvrir
fileToSearch
pour l'écriture, l'ouverture d'un réel fichier temporaire, puis après vous avez terminé et fermétempFile
, utilisezos.rename
pour déplacer le nouveau fichier surfileToSearch
.(pip install python-util)
Le deuxième paramètre (le truc pour être remplacé, par exemple, "abcd" peut aussi être un regex)
Va remplacer toutes les occurences
Ma variante, un mot à la fois sur la totalité du fichier.
Je l'ai lu dans la mémoire.
J'ai fait ceci:
fileinput
doen pas travailler avecinplace=True
avecutf-8
.Je recommande sa vaut la peine de vérifier it out ce petit programme. Les expressions régulières sont la voie à suivre.
https://github.com/khranjan/pythonprogramming/tree/master/findandreplace
dictionary = {'source': 'replacement', ...}; robj = re.compile('|'.join(dictionary.keys())); result = robj.sub(lambda match: dictionary[match.group(0)], src_stream)
!J'ai modifié Jayram Singh post légèrement afin de remplacer toutes les occurrences d'un caractère '!' à un nombre que je voulais à incrémenter à chaque instance. Pensé qu'il pourrait être utile à quelqu'un qui voulait modifier un personnage qui s'est produite plus d'une fois par ligne et je voulais itérer. Espérons que l'aide à quelqu'un. PS - je suis très nouveau à codage alors, toutes mes excuses si mon message est inapproprié en aucune façon, mais cela a fonctionné pour moi.
Avec un seul bloc, vous pouvez rechercher et remplacer votre texte:
seek
au début du fichier avant de l'écrire.truncate
ne pas le faire et si vous avez des ordures dans le fichier.def findReplace(rechercher, remplacer):