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"?


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'))

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.


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)

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>

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)


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.


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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.