2011-07-20 11 views
9

मैं एक टेक्स्ट फ़ाइल से लगभग 20 मिलियन लाइनों को पार्स करने की कोशिश कर रहा हूं और उन प्रश्नों पर कुछ और जोड़-विमर्श करने का तरीका ढूंढ रहा हूं जो प्रश्न चिह्नों से शुरू नहीं होते हैं। मुझे एक समाधान चाहिए जो रेगेक्स मिलान का उपयोग नहीं करता है। कुछ इस तरह मुझे क्या करना चाहते हैं:सभी तारों को प्राप्त करने का सबसे आसान तरीका क्या है जो किसी चरित्र से शुरू नहीं होता है?

for line in x: 
    header = line.startswith('?') 
if line.startswith() != header: 
     DO SOME STUFF HERE 

मुझे पता है startswith विधि एक तर्क लेता है, लेकिन वहाँ एक लाइन है कि एक प्रश्न चिह्न के साथ शुरू नहीं करते से सभी लाइनों प्राप्त करने के लिए किसी भी सरल उपाय है? मदद के लिए अग्रिम धन्यवाद।

उत्तर

21

जनरेटर अभिव्यक्ति का उपयोग करें, मुझे लगता है कि सबसे अच्छा तरीका है।

for line in (line for line in x if not line.startswith('?')): 
    DO_STUFF 

या अपना रास्ता:

for line in x: 
    if line.startswith("?"): 
     continue 
    DO_STUFF 

या:

for line in x: 
    if not line.startswith("?"): 
     DO_STUFF 

यह वास्तव में अपने प्रोग्रामिंग शैली पर निर्भर है। मैं पहले व्यक्ति को पसंद करता हूं, लेकिन शायद दूसरा आसान लगता है। लेकिन मुझे बहुत इंडेंटेशन की वजह से वास्तव में तीसरा पसंद नहीं है।

+0

आप मदद के लिए बहुत बहुत धन्यवाद! – drbunsen

2

कुछ इस तरह शायद है कि तुम क्या कर रहे हैं के बाद:

with open('myfile.txt') as fh: 
    for line in fh: 
    if line[0] != '?': # strings can be accessed like lists - they're immutable sequences. 
     continue 
    # All of the processing here when lines don't start with question marks. 
0

यहाँ एक अच्छा एक लाइनर है, जो प्राकृतिक भाषा के बहुत करीब है।

स्ट्रिंग परिभाषा:

StringList = [ '__one', '__two', 'three', 'four' ] 

कोड जो काम करता है:

BetterStringList = [ p for p in StringList if not(p.startswith('__'))]