Remplacer la chaîne dans le contenu du fichier

97

Comment puis-je ouvrir un fichier, Stud.txt, puis remplacer toute occurrence de "A" par "Orange"?

Joey
la source
4
Veuillez (comme toujours) suivre les directives générales relatives aux questions , indiquer les restrictions spéciales, montrer ce que vous avez essayé jusqu'à présent et demander ce qui vous déroute spécifiquement.
18
Veuillez également marquer vos devoirs avec la balise [devoirs].
S.Lott

Réponses:

181
with open("Stud.txt", "rt") as fin:
    with open("out.txt", "wt") as fout:
        for line in fin:
            fout.write(line.replace('A', 'Orange'))
Gareth Davidson
la source
8
"t" pour le mode texte est uniquement Python 3. En outre, vous fournissez un gestionnaire de contexte pour votre fichier de sortie, mais vous ne parvenez pas à fermer votre fichier d'entrée, ce qui semble incohérent.
Steven Rumbalski
1
@katrielalex: Il n'y a pas de vote négatif, je n'ai simplement pas voté pour. Mais donner des réponses aux devoirs n'est pas la bonne façon de le faire
BlueRaja - Danny Pflughoeft
Euh, je n'ai pas remarqué que c'était étiqueté "devoirs". Je ne supprimerai pas ma réponse mais serai plus prudent à l'avenir
Gareth Davidson
21
"donner des réponses aux problèmes de devoirs" est un commentaire extrêmement stupide. Si quelqu'un veut de l'aide, aidez-le. Tout le monde ne cherche pas à faire son matériel, certains veulent en fait apprendre quelque chose ...
KingMak
5
J'en avais besoin pour mes devoirs et cela m'a énormément aidé
mikeybeck
78

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 withbloc 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 withinstruction.

Adam Matan
la source
Cette solution est meilleure car vous ne renommez pas le fichier contrairement à la réponse ci-dessus.
47
#!/usr/bin/python

with open(FileName) as f:
    newText=f.read().replace('A', 'Orange')

with open(FileName, "w") as f:
    f.write(newText)
Mark Kahn
la source
1
Bref et concis, meilleure réponse IMO
Briford Wylie
11

Quelque chose comme

file = open('Stud.txt')
contents = file.read()
replaced_contents = contents.replace('A', 'Orange')

<do stuff with the result>
TartanLlama
la source
OP a mentionné «toutes les occurrences», cela signifie, même s'il s'agit d'une sous-chaîne - ce qui ne fonctionnera pas pour votre exemple.
Durdu
7
with open('Stud.txt','r') as f:
    newlines = []
    for line in f.readlines():
        newlines.append(line.replace('A', 'Orange'))
with open('Stud.txt', 'w') as f:
    for line in newlines:
        f.write(line)
Falmarri
la source
6

Si vous êtes sous Linux et que vous souhaitez simplement remplacer le mot dogpar, catvous 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

user1767754
la source
2

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_textet 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.

Jorge Moraleda
la source
write_text ne fonctionne pas pour moi. Il ne met pas à jour le fichier
Anurag
0

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)
Austinbv
la source