Comment puis-je ouvrir un fichier, Stud.txt, puis remplacer toute occurrence de "A" par "Orange"?
Comment puis-je ouvrir un fichier, Stud.txt, puis remplacer toute occurrence de "A" par "Orange"?
Réponses:
with open("Stud.txt", "rt") as fin:
with open("out.txt", "wt") as fout:
for line in fin:
fout.write(line.replace('A', 'Orange'))
Si vous souhaitez remplacer les chaînes dans le même fichier, vous devez probablement lire son contenu dans une variable locale, la fermer et la rouvrir pour l'écriture:
J'utilise l'instruction with dans cet exemple, qui ferme le fichier une fois le with
bloc terminé - soit normalement à la fin de l'exécution de la dernière commande, soit par une exception.
def inplace_change(filename, old_string, new_string):
# Safely read the input filename using 'with'
with open(filename) as f:
s = f.read()
if old_string not in s:
print('"{old_string}" not found in {filename}.'.format(**locals()))
return
# Safely write the changed content, if found in the file
with open(filename, 'w') as f:
print('Changing "{old_string}" to "{new_string}" in {filename}'.format(**locals()))
s = s.replace(old_string, new_string)
f.write(s)
Il est à noter que si les noms de fichiers étaient différents, nous aurions pu le faire plus élégamment avec une seule with
instruction.
#!/usr/bin/python
with open(FileName) as f:
newText=f.read().replace('A', 'Orange')
with open(FileName, "w") as f:
f.write(newText)
Quelque chose comme
file = open('Stud.txt')
contents = file.read()
replaced_contents = contents.replace('A', 'Orange')
<do stuff with the result>
Si vous êtes sous Linux et que vous souhaitez simplement remplacer le mot dog
par, cat
vous pouvez faire:
text.txt:
Hi, i am a dog and dog's are awesome, i love dogs! dog dog dogs!
Commande Linux:
sed -i 's/dog/cat/g' test.txt
Production:
Hi, i am a cat and cat's are awesome, i love cats! cat cat cats!
Message d'origine: /ubuntu/20414/find-and-replace-text-within-a-file-using-commands
Utilisation de pathlib ( https://docs.python.org/3/library/pathlib.html )
from pathlib import Path
file = Path('Stud.txt')
file.write_text(file.read_text().replace('A', 'Orange'))
Si les fichiers d'entrée et de sortie étaient différents, vous utiliseriez deux variables différentes pour read_text
et write_text
.
Si vous vouliez une modification plus complexe qu'un simple remplacement, vous affecteriez le résultat de read_text
à une variable, la traitiez et enregistriez le nouveau contenu dans une autre variable, puis enregistrez le nouveau contenu avec write_text
.
Si votre fichier était volumineux, vous préféreriez une approche qui ne lit pas le fichier entier en mémoire, mais plutôt le traite ligne par ligne comme le montre Gareth Davidson dans une autre réponse ( https://stackoverflow.com/a/4128192/3981273 ) , ce qui nécessite bien sûr d'utiliser deux fichiers distincts pour l'entrée et la sortie.
Le moyen le plus simple est de le faire avec des expressions régulières, en supposant que vous souhaitiez parcourir chaque ligne du fichier (où `` A '' serait stocké), vous faites ...
import re
input = file('C:\full_path\Stud.txt), 'r')
#when you try and write to a file with write permissions, it clears the file and writes only #what you tell it to the file. So we have to save the file first.
saved_input
for eachLine in input:
saved_input.append(eachLine)
#now we change entries with 'A' to 'Orange'
for i in range(0, len(old):
search = re.sub('A', 'Orange', saved_input[i])
if search is not None:
saved_input[i] = search
#now we open the file in write mode (clearing it) and writing saved_input back to it
input = file('C:\full_path\Stud.txt), 'w')
for each in saved_input:
input.write(each)