2009-09-30 9 views
9

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

headerProcessed = false 
for line in f: 
    if headerProcessed: 
     processBody(line) 
    else: 
     processHeader(line) 
     headerProcessed = true 

लेकिन मैं पाश है कि हर समय के लाखों यह कार्यान्वित में से एक है, लेकिन के लिए अनावश्यक है में एक परीक्षण नापसंद करते हैं। क्या कोई बेहतर तरीका है? क्या मैं पहली पंक्ति को अलग-अलग समझ सकता हूं, फिर दूसरी पंक्ति पर शुरू करने के लिए पुनरावृत्ति प्राप्त कर सकता हूं? क्या मुझे परेशान होना चाहिए?

उत्तर

15

आप किए जा सकेंगे:

processHeader(f.readline()) 
for line in f: 
    processBody(line) 
+3

धन्यवाद ग्रेग। यह वही है जो मैं करने में सक्षम होने की उम्मीद करता हूं लेकिन किसी भी तरह से यह माना जाता था कि फ़ाइल स्थिति लूप की शुरुआत में रीसेट हो जाएगी। पायथन पाठ सीखा: काम करने के लिए सरल विधि की अपेक्षा करें! –

+3

सीखने के लिए एक और सबक: अपनी धारणाओं का परीक्षण करें। आप बस कोशिश कर सकते थे और पता चला, लेकिन फिर हम सभी को इस दिलचस्प विनिमय से फायदा नहीं हुआ! – Todd

+0

उपरोक्त काम करता है लेकिन आम तौर पर आपको यह मिल सकता है: 'ValueError: पुनरावृत्ति मिश्रण और पढ़ने के तरीके डेटा खो देंगे। – jfs

3

उपयोग आईटीईआर()

it_f = iter(f) 
header = it_f.next() 
processHeader(header) 

for line in it_f: 
    processBody(line) 

यह किसी भी iterable वस्तु के साथ काम करता है।

+3

मुझे लगता है कि "iteratorable" सिर्फ adoratable है। – PaulMcG

+1

सुधार के लिए धन्यवाद: डी –

8
f = file("test") 
processHeader(f.next()) #or next(f) for py3 
for line in f: 
    processBody(line) 

यह काम करता है।

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

बदल दिया .__next__next करने के लिए (वे बराबर हैं, किंतु मुझे लगता है अगले अधिक संक्षिप्त है)।

file बनाम open, file बस मुझे और अधिक स्पष्ट लगता है, इसलिए मैं इसे open से अधिक पसंद करना जारी रखूंगा।

+2

पायथन 3 के लिए, आप कहते हैं कि 'अगला (एफ) ' – u0b34a0f6ae

+1

ध्यान दें कि' खोलें()' को 'फ़ाइल() 'को प्राथमिकता दी गई है। 'फाइल' का सबसे अच्छा उपयोग एक प्रकार के रूप में किया जाता है ('इंस्टेंसेंस (...)')। – EOL

+0

पीई 3 संस्करण 'एफ .__ अगला __() 'नहीं होना चाहिए, लेकिन' अगला (एफ)' - डबल-अंडरस्कोर विधियों को सीधे नहीं कहा जाना चाहिए। – PaulMcG

2

पहली पंक्ति में हेडर के साथ बड़ी टेक्स्ट फ़ाइलें? तो यह सारणीबद्ध डेटा है।

बस यह सुनिश्चित करने के लिए: क्या आपने csv मॉड्यूल देखा है? इसे सभी सारणीय डेटा को संभालना चाहिए, सिवाय इसके कि फ़ील्ड सीमित नहीं हैं बल्कि स्थिति द्वारा परिभाषित किए गए हैं। और यह हेडर सामान भी करता है।

+0

धन्यवाद लेनार्ट, हाँ मैं अक्सर उत्कृष्ट सीएसवी मॉड्यूल का उपयोग करता हूं। –

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