2012-01-25 5 views
28

एक हेडर पंक्ति वाली डेटा फ़ाइल लेने का सबसे अच्छा तरीका क्या है और इस पंक्ति को नामित टुपल में पढ़ें ताकि डेटा पंक्तियों को हेडर नाम से एक्सेस किया जा सके?सीएसवी फ़ाइल डेटा को नामित की पंक्तियों के रूप में पढ़ने के लिए पाइथोनिक तरीका क्या है?

मैं कुछ इस तरह प्रयास किया गया था:

import csv 
from collections import namedtuple 

with open('data_file.txt', mode="r") as infile: 
    reader = csv.reader(infile) 
    Data = namedtuple("Data", ", ".join(i for i in reader[0])) 
    next(reader) 
    for row in reader: 
     data = Data(*row) 

पाठक वस्तु subscriptable नहीं है, इसलिए उपरोक्त कोड एक TypeError फेंकता है। एक नाम शीर्ष में फ़ाइल शीर्षलेख पाठक के लिए पाइथोनिक तरीका क्या है?

उत्तर

31

उपयोग:

Data = namedtuple("Data", next(reader)) 

और लाइन को छोड़ देते हैं:

next(reader) 

एक सतत संस्करण के साथ इस संयोजन नीचे मार्टिन्यू की टिप्पणी के आधार पर, उदाहरण के

import csv 
from collections import namedtuple 
from itertools import imap 

with open("data_file.txt", mode="rb") as infile: 
    reader = csv.reader(infile) 
    Data = namedtuple("Data", next(reader)) # get names from column headers 
    for data in imap(Data._make, reader): 
     print data.foo 
     # ...further processing of a line... 

अजगर 2 के लिए हो जाता है और पायथन 3

के लिए 210
import csv 
from collections import namedtuple 

with open("data_file.txt", newline="") as infile: 
    reader = csv.reader(infile) 
    Data = namedtuple("Data", next(reader)) # get names from column headers 
    for data in map(Data._make, reader): 
     print(data.foo) 
     # ...further processing of a line... 
+1

drbunsen: यह करने के बाद आप के लिए प्रसंस्करण पाश बदल सकते हैं

किसी कारण से आप अभी भी एक collections.namedtuple के रूप में पंक्तियों का उपयोग करने की जरूरत है, यह आसान शब्दकोशों को बदलने के लिए नामित किया गया tuples को इस प्रकार होना चाहिए : 'मानचित्र में डेटा के लिए (डेटा._मेक, पाठक): '। – martineau

+0

@spinup: मैंने आपका संपादन थोड़ा बदल दिया। – martineau

+0

क्या होगा यदि सीएसवी डेटा में हेडर की कमी है? क्या कॉलम में नाम असाइन करने का कोई तरीका है? (यदि सीएसवी डेटा में नामित हेडर की कमी है, और आप कॉलम नाम असाइन करना चाहते हैं, तो ऐसा लगता है कि मेरा एकमात्र विकल्प इसे शब्दकोशों के अनुक्रम के रूप में पढ़ना है)। –

20

कृपया csv.DictReader पर एक नज़र डालें। असल में, यह कॉलम नामों को पहली पंक्ति से प्राप्त करने की क्षमता प्रदान करता है जैसा कि आप खोज रहे हैं और उसके बाद, आपको एक शब्दकोश का उपयोग करके नाम से प्रत्येक कॉलम तक पहुंचने देता है।

with open('data_file.txt') as infile: 
    reader = csv.DictReader(infile) 
    Data = collections.namedtuple('Data', reader.fieldnames) 
    tuples = [Data(**row) for row in reader] 
+2

इस समाधान के साथ समस्या यह है कि प्रत्येक पंक्ति को एक शब्दकोश में परिवर्तित किया जाता है, और उसके बाद नामित tuple में परिवर्तित किया जाता है। इंटरमीडिएट डिक्शनरी की आवश्यकता नहीं है तो अक्षम। –

+0

यह ऑर्डर को सुरक्षित नहीं करता है, इसलिए आपके सीएसवी में पहला कॉलम आपके नामांकित में एक यादृच्छिक बन जाता है। उस बिंदु पर, एक नियम का उपयोग भी कर सकते हैं। – hraban

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

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