2016-03-06 4 views
6

Ich habe CSV-Datei im folgende Format,Python las CSV-Datei mit Zeilen- und Spaltenüberschriften in Wörterbuch mit zwei Schlüsseln

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

ich das in ein Wörterbuch von zwei Schlüsseln lesen müssen, so dass

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

Wenn ich versuche, csv.DictReader mit Standardoptionen

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

ich folgendes zur Auswahl zu haben

Ausgang
{'': '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'} 

Ich bin nicht sicher, wie diese Ausgabe zu verarbeiten, um die Art von Wörterbuch zu erstellen, die mich interessiert.

Der Vollständigkeit halber wäre es auch helfen, wenn Sie ansprechen können, wie Zurückschreiben des Wörterbuchs in eine CSV-Datei mit dem obigen Format

Antwort

10

das Modul CSV Verwendung:

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

Das funktioniert und sieht elegant aus – WanderingMind

+1

Ich habe ein Problem, die Werte im Dict sind Zeichenfolgen und keine ganzen Zahlen. Wie kann ich sicherstellen, dass die Werte im Wörterbuch Ganzzahlen sind – WanderingMind

+1

Siehe meine Bearbeitung - rufen Sie einfach 'int()' auf jedem Wert; Dies schlägt jedoch fehl, wenn nicht einmal ein einzelner Wert in eine ganze Zahl konvertiert werden kann. –

1

Das Format der Eingabedatei ist nicht gerade bequem mit csv Modul zu analysieren. Ich würde Kopfzeilen getrennt analysieren, dann den Rest Zeile für Zeile analysieren, durch , teilen, strippen und Wörterbücher auf dem Weg machen. Der Arbeitscode:

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) 

Drucke:

{'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

können Sie pandas dafür verwenden, auch wenn es ein bisschen zuviel des Guten ist. Das Pro ist, dass es fast nichts zu codieren gibt, um das erwartete Ergebnis zu erhalten.

# 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

Diese Antwort ist elegant. Leider arbeite ich auf einem Server, auf dem Pandas nicht vorhanden ist. Ich möchte momentan keine Python-Einstellungen ändern, da dies die anderen interessanten Pakete zerstören könnte. – WanderingMind

Verwandte Themen