Zastąp ciąg w treści pliku


96

Jak mogę otworzyć plik Stud.txt, a następnie zamienić wystąpienie „A” na „Orange”?


4
Proszę (jak zawsze) postępować zgodnie z ogólnymi wytycznymi dotyczącymi pytań , podać wszelkie specjalne ograniczenia, pokazać, co próbowałeś do tej pory i zapytać o to, co dokładnie wprawia Cię w zakłopotanie.

18
Prosimy również o oznaczanie swojej pracy domowej tagiem [praca domowa].
S.Lott,

Odpowiedzi:


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” dla trybu tekstowego to tylko Python 3. Ponadto udostępniasz menedżera kontekstu dla pliku wyjściowego, ale nie możesz zamknąć pliku wejściowego, co wydaje się niespójne.
Steven Rumbalski

1
@katrielalex: Nie ma głosów przeciw, po prostu nie głosowałem za. Ale udzielanie odpowiedzi na prace domowe nie
BlueRaja - Danny Pflughoeft

Uh, nie zauważyłem, że zostało to oznaczone jako „zadanie domowe”. Nie usunę odpowiedzi, ale w przyszłości będę ostrożniejszy
Gareth Davidson

21
„Odpowiadanie na zadania domowe” to niezwykle głupi komentarz. Jeśli ktoś potrzebuje pomocy, pomóż mu. Nie wszyscy chcą robić swoje HW, niektórzy chcą się czegoś nauczyć ...
KingMak

5
I nie potrzebują tego do prac domowych i to pomogło mi się ogromnie
mikeybeck

78

Jeśli chcesz zamienić ciągi znaków w tym samym pliku, prawdopodobnie będziesz musiał wczytać jego zawartość do zmiennej lokalnej, zamknąć ją i ponownie otworzyć do zapisu:

W tym przykładzie używam instrukcji with , która zamyka plik po zakończeniu withbloku - normalnie po zakończeniu wykonywania ostatniego polecenia lub w drodze wyjątku.

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)

Warto wspomnieć, że gdyby nazwy plików były różne, moglibyśmy zrobić to bardziej elegancko za pomocą jednego withstwierdzenia.


To rozwiązanie jest lepsze, ponieważ nie zmieniasz nazwy pliku w przeciwieństwie do powyższej odpowiedzi.

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
Krótka i zwięzła, najlepsza odpowiedź IMO
Briford Wylie

11

Coś jak

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

<do stuff with the result>

OP wspomniał o „wszelkich wystąpieniach”, co oznacza, nawet jeśli jest to podciąg - który nie będzie działał w Twoim przykładzie.
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

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

Jeśli pliki wejściowe i wyjściowe były różne, użyłbyś dwóch różnych zmiennych dla read_texti write_text.

Jeśli chcesz, aby zmiana była bardziej złożona niż pojedyncza zamiana, możesz przypisać wynik read_textzmiennej do zmiennej, przetworzyć ją i zapisać nową zawartość w innej zmiennej, a następnie zapisać nową zawartość za pomocą write_text.

Jeśli twój plik był duży, wolałbyś podejście, które nie odczytuje całego pliku w pamięci, ale raczej przetwarza go wiersz po wierszu, jak pokazuje Gareth Davidson w innej odpowiedzi ( https://stackoverflow.com/a/4128192/3981273 ) , co oczywiście wymaga użycia dwóch różnych plików wejściowych i wyjściowych.


write_text nie działa dla mnie. Nie aktualizuje pliku
Anurag

0

najprościej jest zrobić to za pomocą wyrażeń regularnych, zakładając, że chcesz iterować po każdej linii w pliku (gdzie byłoby zapisane „A”), co robisz ...

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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.