Zastąp ciąg w treści pliku

96

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

Joey
źródło
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'))
Gareth Davidson
źródło
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.

Adam Matan
źródło
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)
Mark Kahn
źródło
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>
TartanLlama
źródło
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)
Falmarri
źródło
6

Jeśli jesteś na Linuksie i po prostu chcą zastąpić słowo dogz catmożna zrobić:

text.txt:

Hi, i am a dog and dog's are awesome, i love dogs! dog dog dogs!

Polecenie Linuksa:

sed -i 's/dog/cat/g' test.txt

Wynik:

Hi, i am a cat and cat's are awesome, i love cats! cat cat cats!

Oryginalny post: /ubuntu/20414/find-and-replace-text-within-a-file-using-commands

user1767754
źródło
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.

Jorge Moraleda
źródło
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)
austinbv
źródło