Program zamieniający jedno słowo w pliku na drugie

0

Zwracam się z prośbą o to czy wiecie może jak napisać program, który zmieniałby jakieś jedno wybrane słowo. Mianowicie mam plik tekstowy ze słowem UNK i chciałbym je zamienić na DGD (,np. mam 1UNK chce zamienić na 1DGD). W jaki sposób mogę to zrobić? Znalazłem, że może to zrobić funkcja replace, więc zrobiłem to tak.

membrane_box = ''
membrane_box2 = ''
f1 = open('membrane_box', 'r')
f2 = open('membrane_box2', 'w')
pattern=f1.readline()
while pattern != '':
    if pattern == "UNK":
        str.replace("UNK", "DGD")
f1.close()
f2.close()

Ale skrypt ruszył i się nie kończy chyba jak go w linuxie w terminalu wpisałem

1
with open('torepl.txt', 'r') as myfile:
    data=myfile.read().replace('\n', '')
    print(data)
    data = data.replace("UNK", "DGD")
    print(data)

Teraz string data Możesz zapisać gdziekolwiek.

1

Jeśli chcesz wiedzieć co z Twoim kodem jest nie tak...

2 pierwsze linie.. deklarujesz dwie zmienne membrane_box i membrane_box2 przypisujesz im pusty tekst i nic więcej już z nimi nie robisz, więc są niepotrzebne.

readline() odczytuje tylko pojedynczą linię tekstu, jeżeli będą w pliku dwie lub więcej to resztę pominie.

pętla while się nie kończy bo pattern zawsze zawiera tą jedną jedyną odczytaną linie tekstu nic więcej, bo nic innego do niej później nie przypisujesz, więc zawsze jest różne ''

if pattern == "UNK" - ten warunek jest spełniony jedynie wtedy gdy w pliku masz "UNK" i nic innego, jak masz np. "1UNK" to już nie zadziała.

str.replace("UNK", "DGD") - tego się tak nie używa. Chcesz zamienić fragment tekstu w zmiennej pattern, więc jakoś musisz to zasygnalizować, a w tej linii kodu o tym nawet nie wspominasz ;)
powinno być pattern = pattern.replace("UNK", "DGD")
i tu działa magia bo... nie musisz używać if'a, replace sam sprawdzi czy jest tam UNK i jeżeli jest to zamieni na DGD, a jeżeli nie to nic nie zmieni, a także nie musisz używać pętli gdyż replace domyślnie zamienia każde wystąpienie.

1

Jeśli plik jest bardzo duży, np. jakiś zrzut z logów albo inne cholerstwo o długości nie przerabialnej dla przeciętnego człowieka który się nudzi przy trzeciej linijce, polecam ten sposób:

with open('membrane_box', 'r') as f1:
  with open('membrane_box2', 'w') as f2:
    line =  f1.readline()
    while line:
      f2.write(line.replace("UNK", "DGD")+"\n")
      line = f1.readline()

Przy klauzuli with, plik zamknie ci się automatycznie gdy zagnieżdżenie kodu wróci do początku, albo zakończy się program.

@Edit: Alternatywnie tak, ale nie jestem pewien czy to w pythonie tak było że readlines nie wczytuje wszystkiego tylko tworzy generator.

with open('membrane_box', 'r') as f1:
  with open('membrane_box2', 'w') as f2:
    for line in f1.readlines():
      f2.write(line.replace("UNK", "DGD"))

@Edit2:
Jak przypomniał @AsterFV w komentarzu, lepiej iterować przez plik w ten sposób aby działało to jak generator :)

with open('membrane_box', 'r') as f1:
  with open('membrane_box2', 'w') as f2:
    for line in f1:
      f2.write(line.replace("UNK", "DGD"))

1 użytkowników online, w tym zalogowanych: 0, gości: 1