2011-03-09 6 views
8

पायथन में, मैं एक प्रोग्राम लिखना चाहता हूं जो मेरी टेक्स्ट फ़ाइल से लाइनों को फ़िल्टर करता है जिसमें "सेब" शब्द होता है और उन पंक्तियों को एक नई टेक्स्ट फ़ाइल में लिखें। मैंने जो कोशिश की है वह सिर्फ मेरी नई टेक्स्ट फ़ाइल में "सेब" शब्द लिखती है, जबकि मुझे पूरी लाइन चाहिए। मैं पाइथन में एक नौसिखिया हूं, इसलिए कृपया मेरे प्रश्न का उत्तर दें, क्योंकि मुझे वास्तव में इसकी आवश्यकता है।पायथन: एक टेक्स्ट फ़ाइल से फ़िल्टर लाइनें जिसमें एक विशेष शब्द

उत्तर

16

उपयोग सभी लाइनों 'सेब' एक सूची-समझ का उपयोग करते हुए युक्त प्राप्त कर सकते हैं: - एक कोड लाइन में भी - तो

[ line for line in open('textfile') if 'apple' in line] 

आप नए textfile बना सकते हैं:

open('newfile','w').writelines([ line for line in open('textfile') if 'apple' in line]) 

और eyquem सही है: यह पुनरावर्तक के रूप में रखना और लिखने के लिए निश्चित रूप से तेज है

open('newfile','w').writelines(line for line in open('textfile') if 'apple' in line) 
+3

पढ़ने एक सूची समझ एक वस्तु बनाता है के लिए कोई मस्तिष्क क्षति के साथ आसान समाधान प्यार है। जनरेटर अभिव्यक्ति का उपयोग करना बेहतर होगा। जिस तरह से इसे लिखा जा सकता है, '' लाइन में लाइन 'के लिए लाइन (' टेक्स्टफाइल ') लाइन में' सेब ') '' – eyquem

+0

@eyquem: ठीक है, मैं पूरी तरह से सहमत हूं कि - बड़ी फाइलों के लिए - यह होना चाहिए जनरेटर का उपयोग करने के लिए बेहतर, चूंकि एक जनरेटर आलसी व्यवहार करता है और इस प्रकार वह अधिक स्मृति का उपभोग नहीं करता है। लेकिन शायद छोटी फाइलों के लिए सूची-समझ तेजी से समाधान है? – phynfo

+0

@Phynfo: नहीं ... जेनरेटर/इटरेटर्स के रूप में चीजों को रखने के लिए कहीं अधिक कुशल है। सूची समझ अभी भी इटरेटर बना रही है, जो तब एक सूची भर रही है, और एक बार उस सूची को उस लेखिका को पारित करने के बाद जो इसे एक पुनरावर्तक में बदल देती है। –

1

if "apple" in line: कार्य करना चाहिए।

8
from itertools import ifilter 

with open('source.txt','rb') as f,open('new.txt','wb') as g: 

    g.writelines(ifilter(lambda line: 'apple' in line, f)) 
5

जनरेटर का उपयोग करना, इस स्मृति कुशल और तेजी से

def apple_finder(file): 
    for line in file: 
     if 'apple' in line: 
      yield line 


source = open('forest','rb') 

apples = apple_finder(source) 

मैं :-)

+1

के साथ' if 'सेब' को प्रतिस्थापित कर सकते हैं। apple_finder (फ़ाइल) ** एक फ़ंक्शन जनरेटर है और ** सेब ** जनरेटर है। उत्तरार्द्ध एक ही काम करता है जैसे ** ifilter (लैम्ब्डा लाइन: लाइन में 'सेब', एफ) ** दो लाइनों में (आयात शामिल) – eyquem

संबंधित मुद्दे