2011-11-28 2 views
15

पर लूप के लिए पुनरावृत्ति जारी रखें मेरे पास पाइथन में एक साधारण for लूप है जो अपवादों से बाहर निकल रहा है भले ही अपवाद ब्लॉक में continue शामिल है। IndexError पर हिट करते समय पढ़ने के लिए लगभग 10 लाइनें बाकी हैं और for लूप से बाहर निकलती हैं। मुझे यहां क्या समझ नहीं आ रहा है?पायथन: अपवाद

for row in hkx: ##'hkx' are rows being read in from 'csv.open' 
    try: 
     print row[2],row[4] 
    except IndexError, e: 
     print 'Error:',e 
     print 'Row Data:',len(row),row 
     continue ## I thought this would just move on to the next row in 'hkx' 

(माफ करना, यहां कुल अजगर नौसिखिया ...) अग्रिम धन्यवाद!

+11

यह काम करना चाहिए, क्या आपको यकीन है कि कोई अन्य अपवाद नहीं है (न केवल इंडेक्स त्रुटि) उठाया गया है? –

+1

@ नाथन: क्या आप कृपया एक पूर्ण, न्यूनतम उदाहरण पोस्ट कर सकते हैं? –

+1

@ सेड्रिक जुलिएन से सहमत हैं - क्या आप शायद आउटपुट पोस्ट कर सकते हैं? – Marcin

उत्तर

8

यह ठीक उसी तरह करता है जैसा कि इसे अगली पंक्ति के साथ जारी रखना चाहिए। यदि कोई अपवाद आपके कोड को जल्दी समाप्त कर रहा है तो यह या तो इंडेक्स एरर नहीं होना चाहिए, या इसे try: ब्लॉक के बाहर कुछ कोड से फेंक दिया जाना चाहिए।

>>> hkx = [ range(5), range(4), range(4), range(5) ] 
>>> for row in hkx: ##'hkx' are rows being read in from 'csv.open' 
    try: 
     print row[2],row[4] 
    except IndexError, e: 
     print 'Error:',e 
     print 'Row Data:',len(row),row 
     continue ## I thought this would just move on to the next row in 'hkx' 

2 4 
2 Error: list index out of range 
Row Data: 4 [0, 1, 2, 3] 
2 Error: list index out of range 
Row Data: 4 [0, 1, 2, 3] 
2 4 
>>> 

ध्यान दें कि यदि पंक्ति कम से कम 3 आइटम हैं कि आप अपने प्रिंटआउट के आधे मिल जाएगा, यदि आप एक प्रारूप स्ट्रिंग आपको लगता है कि बच सकते हैं का उपयोग करें। (उदाहरण के लिए print "{} {}".format(row[2],row[4]))

आपने यह नहीं कहा है कि एचकेएक्स को कैसे परिभाषित किया गया है सिवाय इसके कि यह csv.open से आता है। यदि यह एक साधारण सूची के बजाय जनरेटर है तो हो सकता है कि यह उस पर फिर से चलने से इंडेक्स एरर फेंकता हो। उस स्थिति में आप उसे पकड़ नहीं पाएंगे लेकिन स्टैक डंप for row in hkx के साथ लाइन दिखाएगा।

+0

एचकेएक्स यहां परिभाषित किया गया है: 'hkx = csv.reader (खुला (HKXcsv,' आरबी ')) ' आप आउटपुट आउटपुट की अंतिम दो पंक्ति से देख सकते हैं। पंक्ति 'पंक्ति डेटा' अपवाद के कारण रेखा की सामग्री दिखाती है। 'पंक्ति डेटा' में लगभग 8 तत्व होना चाहिए, न केवल 'झेंग्झौ'। ऐसा लगता है जब कभी पंक्ति में एक डुप्लिकेट नाम होता है [4]। आउटपुट: 8331 GU कून 8331 LUI विंग हाँग एडवर्ड 8331 बाओ Zhi चाओ 8099 बाओ हाँग वी त्रुटि: सूची सीमा से बाहर पंक्ति डाटा सूचकांक: 1 [ 'झेंग्झौ'] – Nathan

+0

क्या तुरंत csv फ़ाइल में है झेंग्झौ के बाद? फ़ाइल में Ctrl-Z वर्ण हो सकता है? सीएसवी मॉड्यूल फ़ाइल को समाप्त करने के रूप में Ctrl-Z को सम्मानित करेगा (भले ही आपने इसे बाइनरी मोड में खोला हो)। विशेष रूप से ऐसे कोई गैर असीसी वर्ण हैं जो एन्कोड किए गए थे कि मूल्य 26 के साथ एक बाइट है? – Duncan

+0

ठीक है, मैंने इसे 'csv.open' को पूरी तरह से छोड़कर और पंक्ति सूची को वापस सूची से पढ़कर हल किया। तेज़ भी – Nathan