2010-04-07 14 views
17

यह वास्तव में बेवकूफ सवाल हो सकता है, हालांकि मैंने ऑनलाइन चारों ओर देखा है, और एक ठोस जवाब नहीं देखा है।मैं वर्तमान आइटम और अगले को पाइथन लूप में कैसे छोड़ सकता हूं?

क्या ऐसा कुछ करने का कोई आसान तरीका है?

lines = open('something.txt', 'r').readlines() 
for line in lines: 
    if line == '!': 
     # force iteration forward twice 
     line.next().next() 
    <etc> 

सी ++ में करना आसान है; बस इटेटरेटर को एक अतिरिक्त समय बढ़ाएं। क्या Python में ऐसा करने का कोई आसान तरीका है?

मैं यह इंगित करना चाहता हूं कि इस प्रश्न का मुख्य उद्देश्य "फाइलें और ऐसे" पढ़ने और चीजों को छोड़ने के बारे में नहीं है। मैं सी ++ इटरेटर शैली पुनरावृत्ति की तलाश में था। इसके अलावा नया शीर्षक थोड़े गूंगा है, और मुझे नहीं लगता कि यह मेरे प्रश्न की प्रकृति को दर्शाता है।

+5

थोड़ा OT, लेकिन आप) 'readlines करने के लिए कॉल (की जरूरत नहीं है' जब तक आप वास्तव में में पूरी फ़ाइल संग्रहीत करना चाहते हैं लाइनों की एक सूची। 'ओपन()' पहले से ही एक लाइनर को अलग-अलग लाइनों तक पहुंच प्रदान करता है। –

+0

मुझे यह नहीं पता था। धन्यवाद – UberJumper

+0

yup, यह तब तक सही है जब तक कि आप 2.2 से पुरानी पाइथन का उपयोग नहीं कर रहे हैं: पी – wescpy

उत्तर

25

प्रयास करें:

lines = iter(open('something.txt', 'r')) 
for val in lines: 
    if val == "!": 
     lines.next() 
     continue 
    <etc> 

आप StopIteration कहीं पकड़ने के लिए चाहते हो सकता है। यह तब होगा जब इटरेटर समाप्त हो गया हो।

+5

'स्टॉपइटरेशन' अपवाद को दबाने के लिए आप 'अगली (रेखाएं, कोई नहीं)' का उपयोग कर सकते हैं। (पायथन 2.6 की आवश्यकता है) – interjay

+0

बिडरेक्शनल पुनरावृत्ति के लिए कोई मौका? – UberJumper

+1

डिफ़ॉल्ट iterators के साथ नहीं। हालांकि आप सही कार्यों को ओवरराइड करके अपनी खुद की इटरेटर शैली कक्षाएं बना सकते हैं। – ebo

1

बहुत कॉम्पैक्ट नहीं:

skip = False 
for line in open('something.txt'): 
    if skip: 
    skip = False 
    continue 

    if line.strip() == '!': 
    skip = True 
    continue 
+0

लाइन कभी भी ''! 'के बराबर नहीं होगी जब तक कि आप पहले से न्यूलाइन वर्ण (ओं) को पट्टी न करें। – tgray

+0

.strip जोड़कर फिक्स्ड() – Harriv

0

आप प्रत्यावर्तन इस्तेमाल कर सकते हैं

input = iter(open('something.txt')) 
def myFunc(item): 
    val = iter.next() 
    if(val == '!'): 
     item.next() 
     return myFunc(item) 
    #continue on with looping logic 

उसे संपादित पोस्ट जिसके बाद वास्तव में अपने प्रश्न का उत्तर नहीं करतीं:

आप की कोशिश की

है
[line for line in open('something.txt') if line != '!'] 

एक नई सूची बनाने के लिए? या और भी बेहतर

filter(lambda line: line != '!', open('something.txt')) 
+0

सूची समझ के बजाय जनरेटर अभिव्यक्ति का उपयोग क्यों नहीं करें?बस '(' और ']' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –

+1

रिकर्सन संस्करण 1000 से अधिक लाइनों (पायथन कार्यान्वयन निर्भर) वाली फ़ाइलों पर टूट जाएगा। – ebo

+1

जब तक बुरा ट्रैम्पोलिन का उपयोग नहीं किया जाता है: http://aspn.activestate.com/ASPN/Mail/Message/python-tutor/2302231 –

5

फ़ाइल .readlines विधि तारों की एक सूची देता है, और एक सूची में पुनरावृत्त करने से आप लूप के शरीर में पुनरावृत्ति को संशोधित नहीं करने देंगे। लेकिन यदि आप आईटीईआर सूची पर फोन पहले तो आप एक इटरेटर है कि आप पाश शरीर में संशोधित कर सकते हैं मिल जाएगा:

lines = open('something.txt', 'r').readlines() 
line_iter = iter(lines) 
for line in line_iter: 
    if line == '!': 
     # force iteration forward twice 
     line_iter.next() 
     line_iter.next() 
    <etc> 

ebo फ़ाइल वस्तु अपने आप में एक इटरेटर रूप में कार्य करता बताते हैं, ताकि आप एक ही प्राप्त कर सकते हैं के रूप में रीडलाइन को कॉल करके और कॉलर को कॉल छोड़कर प्रभाव।

9

यह, लघु pythonic है, और काम करता है:

with open('something.txt', 'r') as f: # or simply f = open('something.txt', 'r') 
    nobang = (line for line in f if line != '!\n') 
    for line in nobang: 
     #... 

संपादित करें:

के रूप में कई मनाया, यह समाधान अभी तक है। सबसे अच्छा मैं के बारे में सोच सकते हैं कि क्या इस पृष्ठ पर पहले से ही है का एक संयोजन है:

with open('something.txt', 'r') as f: 
    for line in f: 
     if line == '!\n': 
      next(f,None) # consume next line 
      continue # skip this line 
     # ... 
+0

यह पी 3 के वाक्यविन्यास है, है ना? – Dingle

+3

यह अगली पंक्ति को छोड़ नहीं देता है। – interjay

+0

@ डिंगल: नहीं, बस 2.6 या बाद में। –

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