2012-06-22 10 views
11

मैं पायथन का एक शुरुआत कर रहा हूं। मैं अब यह पता लगाने की कोशिश कर रहा हूं कि दूसरा 'फॉर' लूप निम्न स्क्रिप्ट में क्यों काम नहीं करता है। मेरा मतलब है कि मैं केवल पहले 'फॉर' लूप का परिणाम प्राप्त कर सकता हूं, लेकिन दूसरे से कुछ भी नहीं। मैंने नीचे अपनी स्क्रिप्ट और डेटा सीएसवी की प्रतिलिपि बनाई और चिपकाया।मैं csv.Reader के लिए 'for' loop क्यों दोहरा सकता हूं? (पायथन)

यह मददगार होगा यदि आप मुझे बताते हैं कि यह इस तरह क्यों जाता है और दूसरे 'लूप' के काम को कैसे बनाया जाए।

मेरे स्क्रिप्ट:

import csv 

file = "data.csv" 

fh = open(file, 'rb') 
read = csv.DictReader(fh) 

for e in read: 
    print(e['a']) 

for e in read: 
    print(e['b']) 

"data.csv":

a,b,c 
tree,bough,trunk 
animal,leg,trunk 
fish,fin,body 

उत्तर

26

सीएसवी पाठक फ़ाइल पर एक इटरेटर है। एक बार जब आप इसे एक बार जाते हैं, तो आप फ़ाइल के अंत तक पढ़ते हैं, इसलिए पढ़ने के लिए और कुछ नहीं है। आप इसे फिर से के माध्यम से जाने की जरूरत है, तो आप फ़ाइल की शुरुआत करना चाहते हैं कर सकते हैं:

fh.seek(0) 

यह शुरुआत करने के लिए फ़ाइल को रीसेट कर देगा, तो आप इसे फिर से पढ़ सकते हैं।

तो फ़ाइल बहुत बड़ी नहीं है और आप डेटा के साथ कई काम करने होंगे, आप भी बस पूरी बात एक सूची में पढ़ सकता है:

data = list(read) 

तो फिर तुम क्या आप के साथ चाहते हैं कर सकते हैं data

+0

fileobject लिए (CSV है बनाया है) उसी तरह पढ़ा? – SIslam

+0

@SIslam: हाँ, अगर मैं आपको सही समझता हूं। यदि आप किसी फ़ाइल पर पुन: प्रयास करते हैं, तो जब आप अंत तक पहुंच जाते हैं तो आपने इटेटरेटर को समाप्त कर दिया है और जब तक आप शुरुआत में वापस नहीं आते हैं तब तक और नहीं पढ़ सकते हैं। – BrenBarn

2

मैं समारोह के छोटे टुकड़े जो पढ़ सकते हैं और बहुत आसानी से तो एक ही बार में लौटने dict की सूची आप सूची के माध्यम से पाश csv फ़ाइल के रास्ते ले doe,

def read_csv_data(path): 
    """ 
     Reads CSV from given path and Return list of dict with Mapping 
    """ 
    data = csv.reader(open(path)) 
    # Read the column names from the first line of the file 
    fields = data.next() 
    data_lines = [] 
    for row in data: 
     items = dict(zip(fields, row)) 
     data_lines.append(items) 
    return data_lines 

सादर

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