2013-03-11 12 views
14

Chciałbym skopiować niektóre wiersze tekstu z jednego pliku tekstowego do drugiego. W moim bieżącym skrypcie, gdy szukam ciągu, kopiuje on wszystko później, jak mogę skopiować tylko pewną część tekstu? Na przykład. tylko kopiować linie, gdy ma w sobie "testy/plik/słowo"?Kopiowanie z jednego pliku tekstowego na inny przy użyciu Python

kod prąd:

#!/usr/bin/env python 
f = open('list1.txt') 
f1 = open('output.txt', 'a') 

doIHaveToCopyTheLine=False 

for line in f.readlines(): 

    if 'tests/file/myword' in line: 
     doIHaveToCopyTheLine=True 

    if doIHaveToCopyTheLine: 
     f1.write(line) 

f1.close() 
f.close() 
+0

@AshwiniChaudhary nie bój się oznaczyć te pytania jako niskiej jakości. –

+2

lub .. jeszcze lepiej ... po prostu kliknij "edytuj". –

+0

Problem z twoim kodem: musisz zresetować flagę przy każdej iteracji pętli. – ATOzTOA

Odpowiedz

44

oneliner:

open("out1.txt", "w").writelines([l for l in open("in.txt").readlines() if "tests/file/myword" in l]) 

Zalecane z with:

with open("in.txt") as f: 
    lines = f.readlines() 
    lines = [l for l in lines if "ROW" in l] 
    with open("out.txt", "w") as f1: 
     f1.writelines(lines) 

mniej pamięci:

with open("in.txt") as f: 
    with open("out.txt", "w") as f1: 
     for line in f: 
      if "ROW" in line: 
       f1.write(line) 
+0

fajne! to pachnie funkcjonalnym stylem 101% :) –

+0

@ATOzTOA dziękuję za kod i wyjaśnienie problemu. – DevCon

+2

Kciuki w dół dla mnie ... ten kod tworzy drugą listę przed napisaniem. Nie jest skalowalny. Nie należy używać instrukcji readlines() ani listy ze zrozumieniem, które tworzą drugą listę. – tdelaney

4

readlines() odczytuje cały plik wejściowy do listy i nie jest dobrym wykonawcą. Po prostu powtarzaj linijki w pliku. Użyłem "z" na output.txt, aby po zakończeniu było automatycznie zamknięte. To nie jest potrzebne w "liście1.txt", ponieważ zostanie zamknięte po zakończeniu pętli for.

#!/usr/bin/env python 
with open('output.txt', 'a') as f1: 
    for line in open('list1.txt'): 
     if 'tests/file/myword' in line: 
      f1.write(line) 
3

Tylko odrobinę wyczyszczony sposób robienia tego. To nie jest mniej lub bardziej wydajne niż odpowiedź ATOzTOA, ale nie ma powodu, aby robić dwa oddzielne z instrukcjami.

with open(path_1, 'a') as file_1, open(path_2, 'r') as file_2: 
    for line in file_2: 
     if 'tests/file/myword' in line: 
      file_1.write(line) 
-1
f = open('list1.txt') 
f1 = open('output.txt', 'a') 

# doIHaveToCopyTheLine=False 

for line in f.readlines(): 
    if 'tests/file/myword' in line: 
     f1.write(line) 

f1.close() 
f.close() 

Teraz Twój kod będzie działać. Spróbuj tego.

0

bezpieczne i oszczędność pamięci:

with open("out1.txt", "w") as fw, open("in.txt","r") as fr: 
    fw.writelines(l for l in fr if "tests/file/myword" in l) 

To nie tworzyć listy tymczasowych (co readline i [] zrobi, który jest non-starter, jeśli plik jest ogromny), wszystko odbywa się za pomocą generatora ze zrozumieniem i używanie bloków with zapewnia, że ​​pliki są zamykane przy wyjściu.

0

z otwartym ("list1.txt") jako f: doIHaveToCopyTheLine = False '' 'otwartym pliku wyjściowego w trybie zapisu' ' z otwartym ("output.txt", 'w') jako f1: '' 'iteracyjne wiersz po wierszu' '' dla linii F: jeżeli 'testy/plik/myword' zgodnie: doIHaveToCopyTheLine = True elsif doIHaveToCopyTheLine: f1.write (linii)

F1. close() f.close()

Powiązane problemy