2016-03-06 5 views
6

मैं निम्न स्वरूप का csv फ़ाइल के साथ शब्दकोश में पंक्ति और स्तंभ हेडर के साथ csv फ़ाइल को पढ़ने,अजगर दो चाबियाँ

,col1,col2,col3 
row1,23,42,77 
row2,25,39,87 
row3,48,67,53 
row4,14,48,66 

मैं दो चाबियों का एक शब्दकोश में इस पढ़ने की जरूरत है इस तरह के

dict1['row1']['col2'] = 42 
dict1['row4']['col3'] = 66 
कि

मैं

with open(filePath, "rb") as theFile: 
    reader = csv.DictReader(theFile, delimiter=',') 
    for line in reader: 
    print line 

मैं निम्न डिफ़ॉल्ट विकल्पों के साथ csv.DictReader का उपयोग करने का प्रयास करें उत्पादन

{'': 'row1', 'col2': '42', 'col3': '77', 'col1': '23'} 
{'': 'row2', 'col2': '39', 'col3': '87', 'col1': '25'} 
{'': 'row3', 'col2': '67', 'col3': '53', 'col1': '48'} 
{'': 'row4', 'col2': '48', 'col3': '66', 'col1': '14'} 

मैं कैसे इस उत्पादन पर कार्रवाई करने के शब्दकोश के प्रकार है कि मैं में दिलचस्पी रखता हूँ बनाने के लिए के बारे में सुनिश्चित नहीं हूँ।

पूर्णता के लिए के लिए, यह भी यदि आप कैसे पता कर सकते हैं मदद मिलेगी उपरोक्त प्रारूप

उत्तर

10

सीएसवी मॉड्यूल का उपयोग करना:

import csv 
dict1 = {} 

with open("test.csv", "rb") as infile: 
    reader = csv.reader(infile) 
    headers = next(reader)[1:] 
    for row in reader: 
     dict1[row[0]] = {key: int(value) for key, value in zip(headers, row[1:])} 
+0

वह काम करता है और सुरुचिपूर्ण दिखता है – WanderingMind

+1

मेरे पास एक मुद्दा है, dict में मान स्ट्रिंग हैं और पूर्णांक नहीं हैं। मैं कैसे सुनिश्चित कर सकता हूं कि शब्दकोश में मान पूर्णांक हैं – WanderingMind

+1

मेरा संपादन देखें - बस प्रत्येक मान पर 'int() 'पर कॉल करें; हालांकि, यह असफल हो जाएगा यदि एक भी मूल्य को एक पूर्णांक में परिवर्तित नहीं किया जा सकता है। –

1

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

from pprint import pprint 

d = {} 
with open("myfile.csv") as f: 
    headers = [header.strip() for header in next(f).split(",")[1:]] 

    for line in f: 
     values = [value.strip() for value in line.split(",")] 
     d[values[0]] = dict(zip(headers, values[1:])) 

pprint(d) 

प्रिंटों:

{'row1': {'col1': '23', 'col2': '42', 'col3': '77'}, 
'row2': {'col1': '25', 'col2': '39', 'col3': '87'}, 
'row3': {'col1': '48', 'col2': '67', 'col3': '53'}, 
'row4': {'col1': '14', 'col2': '48', 'col3': '66'}} 
4

आप उस के लिए pandas उपयोग कर सकते हैं, भले ही यह थोड़ा एक overkill है। समर्थक यह है कि अपेक्षित परिणाम प्राप्त करने के लिए कोड के लिए लगभग कुछ भी नहीं है।

# Reading the file 
df = pd.read_csv('tmp.csv', index_col=0) 

# Creating the dict 
d = df.transpose().to_dict(orient='series') 

print(d['row1']['col2']) 
42 
+0

इस उत्तर सुरुचिपूर्ण है। दुर्भाग्यवश मैं सर्वर पर काम कर रहा हूं जहां पांडु मौजूद नहीं हैं। मैं पल में किसी भी पायथन सेटिंग को संशोधित नहीं करना पसंद करता, क्योंकि यह ब्याज के अन्य पैकेज तोड़ सकता है। – WanderingMind

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