2017-08-16 15 views
5

मैं फ़ाइल को पार्स करने के लिए csv लाइब्रेरी का उपयोग कर रहा हूं। मुझे 6 पंक्तियों को छोड़ने और सीधे 7 वें पंक्ति पर जाने और बाकी को पार्स करने की आवश्यकता है। मैं reader.next() 6 बार चलाने के लिए सक्षम हूँ, लेकिन यह अजीब लग रहा है:क्या Python में फ़ाइल पढ़ने के दौरान एक विशिष्ट लाइन नंबर पर जाने का कोई तरीका है?

reader = csv.reader(csvfile) 

reader.next() 
reader.next() 
reader.next() 
reader.next() 
reader.next() 
reader.next() 

for row in reader: 
    print row 

तो मैं वहाँ 6 पंक्तियों का एक और तरीका छोड़ कोई तरीका है सोच रहा हूँ?

+0

क्यों इस श्रेणी के लिए चक्र का उपयोग न करें (6): reader.next() ' – varela

+0

यह भी कर सकता है: सूची में पंक्ति के लिए (पाठक) [6:] - हालांकि सबसे कुशल नहीं है। –

उत्तर

10

हां। itertools.islice का उपयोग करें:

from itertools import islice 
reader = csv.reader(csvfile) 

for row in islice(reader, 7, None): 
    print row 

यह islice एक iterable, उसके बाद निम्न स्थितीय तर्क एक बहुत अपने ठेठ सूची टुकड़ा करने की क्रिया शुरू रोकने के कदम की तरह काम लेता है:

>>> x = list(range(14)) 
>>> x[7:None] 
[7, 8, 9, 10, 11, 12, 13] 
>>> x[7:] 
[7, 8, 9, 10, 11, 12, 13] 
>>> 
>>> list(islice(x, 7, None)) 
[7, 8, 9, 10, 11, 12, 13] 

हालांकि, कोई नकारात्मक अनुक्रमण की अनुमति दी।

>>> list(islice(x, -1, None)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: Indices for islice() must be None or an integer: 0 <= x <= maxint. 
>>> 

हालांकि, यह अभी उदाहरण के लिए बहुत लचीला है, इसलिए, हर दूसरे पंक्ति पहले (यानी सम-संख्यांकित पंक्तियों) से शुरू लेने:

for row in islice(reader, None, None, 2): 
    print row 

या हर दूसरे पंक्ति शुरू दूसरी पंक्ति (यानी विषम क्रमांकित पंक्तियाँ) पर:

for row in islice(reader, 1, None, 2): 
    print row 
0

आप कर सकता है:

for i, row in enumerate(reader): 
    if i<7: continue 
    print row 

या आप लपेट कर सकते हैं कि एक जनरेटर में:

for row in (e for i, e in enumerate(reader) if i>=7): 
    print row 

आप कुछ विशिष्ट लाइनों को छोड़ करना चाहते हैं:

for i, row in enumerate(reader): 
    if i in (1,13,666): continue # skip unlucky lines... 
    print row 

या, लपेटकर कि एक जनरेटर में:

for row in (e for i, e in enumerate(reader) if i not in (1,13,666)): 
    print row 
+0

क्या मैं पूछ सकता हूं कि नीचे वोट क्यों? – dawg

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

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