2010-06-23 11 views
26

मैंने पाइथन के csv.reader का उपयोग करने का एकमात्र तरीका लूप में किया है, जो चर में पढ़ने के पिछले मानों को सहेजे बिना पूरी फ़ाइल के माध्यम से जाता है। मुझे केवल एक समय में (विशाल) फ़ाइल की लगातार 2 पंक्तियों के साथ काम करने की आवश्यकता है। लूप के लिए csv.reader का उपयोग करके, मेरे पास एक समय में केवल 1 पंक्ति है।पूरी फाइल के माध्यम से लूपिंग के बिना पायथन में .csv पढ़ना?

क्या फ़ाइल को अंत में फ़ाइल को पढ़ने के बिना सीएसवी फ़ाइल की केवल एक पंक्ति लेने के लिए पाइथन के सीएसवी मॉड्यूल का उपयोग करने का कोई तरीका है?

मुझे पहली पंक्ति में मानों को चर सेट करने की आवश्यकता है, अगली पंक्ति के मानों के चर के दूसरे सेट को सेट करें, कंप्यूटेशंस के लिए एक साथ चर के दो सेट का उपयोग करें, फिर चर के साथ पहले चर को ओवरराइट करें दूसरा सेट, और दूसरे सेट को ओवरराइट करने के लिए एक नई लाइन पढ़ें।

+1

क्या आप पहले सेट को स्टोर नहीं कर सकते? – SilentGhost

+0

मुझे प्रश्न समझ में नहीं आता है। क्या आप पूछ रहे हैं कि क्या मैं पहली पंक्ति को चर में स्टोर करने में सक्षम हूं? – mary

+0

हां, क्या आपको दूसरी पंक्ति तक पहुंचने से पहले लाइन को स्टोर करने से रोकता है, फिर दोनों का उपयोग करते हैं? – SilentGhost

उत्तर

40

आपको लूप में पाठक का उपयोग करने के लिए मजबूर करने के लिए कुछ भी नहीं है। बस पहली पंक्ति पढ़ें, फिर दूसरी पंक्ति पढ़ें।

import csv 
rdr = csv.reader(open("data.csv")) 
line1 = rdr.next() # in Python 2, or next(rdr) in Python 3 
line2 = rdr.next() 
+0

बहुत उपयोगी, धन्यवाद। जिस तरह से मैं अपने कॉलम में लाइन को विभाजित कर रहा था वह था: आर = सीएसवी.reader (खुला ("data.csv")) कॉल 1, col2, col3 में r1: x = float (col1) y = आदि ... लूप के बजाय r.next() का उपयोग करके मुझे उस विधि को अनुकूलित करने की आवश्यकता कैसे है? दूसरे शब्दों में, मैं पूरी लाइन से कॉलम प्रविष्टियों को कैसे निकालूं? – mary

+1

@mary: मेरे उदाहरण में, लाइन 1 सिर्फ एक सूची है इसलिए लाइन 1 [0] पहला कॉलम होगा, लाइन 1 [1] दूसरा कॉलम इत्यादि। यदि आप चाहते हैं, तो आप कुछ कर सकते हैं जैसे (col1, col2, col3) = line1' –

+0

पायथन 3 में, 'r.next()' विधि के बजाय 'अगला (आर)' बिल्टिन फ़ंक्शन का उपयोग करें। – smci

2

स्पष्ट उत्तर केवल प्रत्येक पुनरावृत्ति पर पिछली पंक्ति को स्टोर करना प्रतीत होता है।

>>> for x in csv.DictReader(stream): 
... print prevLine 
... print x 
... prevLine = x 
.... 
+2

@ टीके: यह कोड, जैसा है, असफल हो जाएगा क्योंकि आप प्रचलित प्रारंभ नहीं करते हैं। –

3

टीके से ब्लैंटेंट चोरी ... ... ज्यादातर सवाल यह है कि, ओपी फाइल की पहली और आखिरी पंक्तियों के साथ क्या करना चाहता है?

prevLine = None 

for x in csv.DictReader(stream): 
    if prevLine is not None: 
     DoWork(prevLine, x) 
    else: 
     Initialize(x) 
    prevLine = x 

Finalize(prevLine) 
+0

प्रत्येक पंक्ति में पद होते हैं, तो मुझे उनके बीच वेगों की गणना करने और एक से दूसरे तक यात्रा करने वाली वस्तु को एनिमेट करने की आवश्यकता होती है। एक बार ऑब्जेक्ट द्वारा आखिरी स्थिति मारा जाता है, तो प्रोग्राम खत्म हो जाता है। – mary

+0

उस प्रश्न का उत्तर सूचित करना चाहिए कि आपको डेटा के साथ क्या करना है। या तो आप विशेष रूप से पहली और आखिरी पंक्तियों का इलाज करते हैं (जैसे मैंने किया है), या आपको अंत में "खाली" पिछली या अगली पंक्तियों से निपटने की ज़रूरत है। –

4

आप हमेशा बिल्कुल लगातार दो लाइनों पर देख रहे हैं, यह मेरे लिए लग रहा है कि आप की तरह जोड़ो में recipe का उपयोग करने से लाभ हो सकता है। itertools मॉड्यूल से:

from itertools import tee, izip 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

तुम इतनी तरह इस का प्रयोग करेंगे:

for first_dict, second_dict in pairwise(csv.DictReader(stream)): 
    # do stuff with first_dict and second_dict 
4

पढ़ें सीएसवी:

readCSV = csv.reader(csvFile, delimiter=',') 

अजगर 2.7 में अगली पंक्ति पढ़ें:

row = readCSV.next() 

पायथन 3.4 में अगली पंक्ति पढ़ें:

row = readCSV.__next__() 
+8

मैं 'row = next (readCSV)' का उपयोग करने की सलाह दूंगा। यह दोनों पायथन 2.7 और 3 दोनों में काम करता है, और आपके द्वारा वर्णित विधियों को कॉल करने के अलावा कुछ भी नहीं करता है। – PeterE

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