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].
„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 notin s:print('"{old_string}" not found in {filename}.'.format(**locals()))return# Safely write the changed content, if found in the filewith 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.
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)
from pathlib importPath
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)
Odpowiedzi:
źródło
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
with
bloku - normalnie po zakończeniu wykonywania ostatniego polecenia lub w drodze wyjątku.Warto wspomnieć, że gdyby nazwy plików były różne, moglibyśmy zrobić to bardziej elegancko za pomocą jednego
with
stwierdzenia.źródło
źródło
Coś jak
źródło
źródło
Jeśli jesteś na Linuksie i po prostu chcą zastąpić słowo
dog
zcat
można zrobić:text.txt:
Polecenie Linuksa:
Wynik:
Oryginalny post: /ubuntu/20414/find-and-replace-text-within-a-file-using-commands
źródło
Korzystanie z pathlib ( https://docs.python.org/3/library/pathlib.html )
Jeśli pliki wejściowe i wyjściowe były różne, użyłbyś dwóch różnych zmiennych dla
read_text
iwrite_text
.Jeśli chcesz, aby zmiana była bardziej złożona niż pojedyncza zamiana, możesz przypisać wynik
read_text
zmiennej 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.
źródło
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 ...
źródło