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.