2016-03-06 28 views
6

Mam pliku csv w następującej formie,pyton odczytać pliku csv z nagłówków wierszy i kolumn w słowniku z dwoma kluczami

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

muszę przeczytać w słowniku dwóch kluczy tak, że

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

Jeśli próbuję użyć csv.DictReader z domyślnymi opcjami

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

uzyskać następujące Wyjście

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

nie jestem pewien, w jaki sposób przetwarzać tego wyjścia do stworzenia rodzaj słownika, który mnie interesuje.

Dla Uzupełniająco to również pomóc, jeśli można zająć jak do zapisania słownika w pliku csv w powyższym formacie:

Odpowiedz

10

Za pomocą modułu CSV:

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

To działa i wygląda elegancko – WanderingMind

+1

Mam jeden problem, wartości w dyktafonie są łańcuchami, a nie liczbami całkowitymi. Jak mogę się upewnić, że wartości w słowniku są liczbami całkowitymi? – WanderingMind

+1

Zobacz moją edycję - po prostu wywołaj 'int()' na każdej wartości; jednak nie powiedzie się, jeśli nawet jedna wartość nie może być przekształcona na liczbę całkowitą. –

1

Format pliku wejściowego nie jest dokładnie wygodny do analizy za pomocą modułu csv. Sparowałbym nagłówki osobno, a następnie przeanalizowałbym resztę linii po linii, rozdzielając według ,, rozbierając i tworząc słowniki po drodze. Kod pracy:

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) 

Wydruki:

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

Można użyć pandas za to nawet jeśli jest to trochę overkill. Pro jest taki, że prawie nic nie ma kodu, aby uzyskać oczekiwany rezultat.

# 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

Ta odpowiedź jest elegancki. Niestety pracuję na serwerze, na którym Panda nie jest obecna. Nie chcę w tej chwili modyfikować żadnego ustawienia Pythona, ponieważ mogłoby to spowodować złamanie innych pakietów. – WanderingMind