Sostituisci la stringa all'interno del contenuto del file


97

Come posso aprire un file, Stud.txt, e quindi sostituire le occorrenze di "A" con "Orange"?


4
Per favore (come sempre) segui le linee guida generali per le domande , indica eventuali restrizioni speciali, mostra ciò che hai provato finora e chiedi cosa specificamente ti confonde.

18
Per favore, inoltre, contrassegna i tuoi compiti con il tag [homework].
S.Lott

Risposte:


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" per la modalità testo è solo Python 3. Inoltre, fornisci un gestore di contesto per il tuo file di output, ma non riesci a chiudere il file di input, che sembra incoerente.
Steven Rumbalski

1
@katrielalex: non ci sono voti negativi, semplicemente non ho votato favorevolmente. Ma dare risposte ai compiti non
BlueRaja - Danny Pflughoeft

Uh, non ho notato che era etichettato con "compiti". Non cancellerò la mia risposta ma starò più attento in futuro
Gareth Davidson

21
"dare risposte ai problemi dei compiti" è un commento estremamente stupido. Se qualcuno vuole aiuto, aiutalo. Non tutti stanno cercando di fare il loro HW, alcuni vogliono davvero imparare qualcosa ...
KingMak

5
Ne avevo bisogno per i compiti e mi ha aiutato immensamente
mikeybeck

78

Se desideri sostituire le stringhe nello stesso file, probabilmente devi leggerne il contenuto in una variabile locale, chiuderla e riaprirla per la scrittura:

Sto usando l'istruzione with in questo esempio, che chiude il file dopo che il withblocco è terminato, normalmente quando l'ultimo comando termina l'esecuzione o per un'eccezione.

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)

Vale la pena ricordare che se i nomi dei file fossero diversi, avremmo potuto farlo in modo più elegante con una singola withdichiarazione.


Questa soluzione è migliore perché non si rinomina il file a differenza della risposta sopra.

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
Breve e conciso, migliore risposta IMO
Briford Wylie

11

Qualcosa di simile a

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

<do stuff with the result>

OP ha menzionato "qualsiasi occorrenza" questo significa, anche quando si tratta di una sottostringa, che non funzionerà per il tuo esempio.
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

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

Se i file di input e di output fossero diversi, useresti due variabili diverse per read_texte write_text.

Se si desidera una modifica più complessa di una singola sostituzione, assegnare il risultato di read_texta una variabile, elaborarla e salvare il nuovo contenuto su un'altra variabile, quindi salvare il nuovo contenuto con write_text.

Se il tuo file fosse di grandi dimensioni, preferiresti un approccio che non legga l'intero file in memoria, ma piuttosto lo elabori riga per riga come mostrato da Gareth Davidson in un'altra risposta ( https://stackoverflow.com/a/4128192/3981273 ) , che ovviamente richiede l'utilizzo di due file distinti per l'input e l'output.


write_text non funziona per me. Non sta aggiornando il file
Anurag

0

Il modo più semplice è farlo con espressioni regolari, assumendo che tu voglia iterare su ogni riga del file (dove sarebbe memorizzata 'A') che fai ...

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.