Python

2013-03-11 13 views
14

ile bir metin dosyasından diğerine kopyalama Belirli metin satırlarını bir metin dosyasından diğerine kopyalamak istiyorum. Şu anki senaryomda, bir dizgeyi aradığımda daha sonra her şeyi kopyalar, metnin sadece belirli bir bölümünü nasıl kopyalarım? Örneğin. sadece "testler/dosya/myword" içerdiğinde satırları kopyala?Python

geçerli kod:

#!/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 yok Bu soruları düşük kaliteli olarak işaretlemekten çekinmeyin. –

+2

ya da .. daha iyisi… sadece 'düzenle'yi tıklayın. –

+0

Kodunuzdaki sorun: Döngünün her yinelemesinde bayrağı sıfırlamanız gerekir. – ATOzTOA

cevap

44

oneliner:

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

with ile Önerilen:

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) 

az bellek kullanarak:

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

havalı! Bu fonksiyonel tarzı kokuyor% 101 :) –

+0

@ATOzTOA kod için teşekkürler ve sorunu açıklayan. – DevCon

+2

Başparmak benim için ... bu kod yazmadan önce ikinci bir liste oluşturur. Onun ölçeklenebilir değil. Ne okur() ne de ikinci liste yaratan liste kavraması kullanılmamalıdır. – tdelaney

4

readlines() tüm giriş dosyasını bir listeye okur ve iyi bir performans göstermez. Sadece dosyadaki satırlar boyunca yineleyin. Çıktığında otomatik olarak kapanacak şekilde output.txt ile 'with' kullanılır. 'List1.txt' için buna gerek yoktur çünkü for döngüsü sona erdiğinde kapanacaktır.

#!/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

Bunu biraz temizlemenin bir yolu. Bu, ATOzTOA'nın cevabından daha fazla veya daha az performans göstermez, ancak ifadelerle iki ayrı işlem yapmak için bir sebep yoktur.

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() 

Şimdi kod çalışacaktır. Bunu dene.

0

Güvenli ve hafıza tasarrufu:

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) 

Geçici listeleri (readline ve [] dosya çok büyük ise olmayan bir marş olan ne yapacağını) yaratmaz, tüm jeneratör ile yapılır anlama ve with bloklarını kullanarak dosyaların çıkışta kapalı olduğundan emin olun. Açık ile ' doIHaveToCopyTheLine = False ' 'yazma modunda açık çıktı dosyası' ("output.txt", 'w') f1 olarak: f açık ("list1.txt") ile

0

: '' 'f hattı için 'satır satır yineleme': halinde doğrultusunda 'testleri/dosya/myword': doIHaveToCopyTheLine = Gerçek elif doIHaveToCopyTheLine: f1.write (hat)

f1. close() f.close()