2016-10-29 4 views
0

Das Problem mit:Spalt Zugriff dictreader

Ich habe mit einem Problem versucht, den Durchschnitt einer Spalte aus einer CSV-Datei dictreader des mit Python zu finden.

Ich habe versucht:

die Spalten wie folgt Zugriff auf die Spaltennamen verwenden, dies funktioniert aber der Spaltenname ist erforderlich und im nicht sicher, wie eine Schleife über die reader.fieldnames in eine Weise, um eine Liste zu konstruieren von nur jede einzelne Spalte anstatt alle Spalten-Daten in der gleichen Liste Mischen:

  for r in reader: 
      print(r.get("Price")) 

Beispiel der Schleife

for i in reader.fieldnames: 
    for r in reader: 
     print(row.get(i)) 

Dies ist in Ordnung, druckt jedoch für jede Zeile 1 Element aus jeder Spalte aus. Dies macht es schwierig, eine Liste aller Preise, aller Namen usw. zusammenzustellen, da dies den Diktator einfach in Listenform wiederherstellen würde.

Frage

Wie können wir lesen nur eine einzige ganze Spalte von dictreader, so kann ich jede Spalte einzeln als Liste zuzugreifen und Operationen darauf ausführen?

Hinweis: Bisher habe ich versucht, jedes Element mit der Schleife anhängen, aber ergibt eine N Größe Array mit 4 Elementen in jeder Zeile.

Antwort

1

Wenn Sie sich fein über die Dateien einmal für jede Spalte Looping Sie lesen möchten, bauen gerade ein dict Verständnis Listenkomprehensionen:

columns = {fieldname: [row.get(fieldname) for row in reader] for fieldname in reader.fieldnames} 

Es gibt nicht wirklich einen besseren Weg, es zu tun, nur basierend über die Art der Datei ... csv's sind eine Reihe von Zeilen, die sie in Spalten verwandeln wird ein wenig verschwenderisch sein. Sie können daran basteln, wenn Sie nur bestimmte Feldnamen extrahieren möchten.

Wenn Sie wirklich brauchen, um die Datei nur einmal zu lesen, aber:

columns = {} 
for row in reader: 
    for fieldname in reader.fieldnames: 
     columns.setdefault(fieldname, []).append(row.get(fieldname)) 
2

könnten Sie das pandas Modul verwenden. Es ist sehr mächtig und kann mit CSV-Dateien umgehen.

import pandas as pd 
df = pd.read_csv(csv_file) 
saved_column = df['column_name'] 
+0

Guter Rat und vielen Dank für die Beantwortung! aber im im Idealfall wollen keine zusätzlichen Bibliotheken über csv etc. hinaus. – D3181

+0

'Pandas' und' Petl' sind beide ausgezeichnete Wahlen, wenn Ihr Datensatz von einer beträchtlichen Größe ist oder wenn die Anforderungen Ihres Projektes anfangen zu wachsen. Meine Antwort war definitiv die naive "Programming 101" -Lösung, in der Natur würde man erwarten, eines dieser Module zu benutzen. –

+0

@ToreEschliman - Wenn Sie nicht die volle Funktionalität eines Pandas DataFrames benötigen - wenn Sie die Aufgabe einfach mit * build-ins * ausführen können, ist es möglicherweise nicht sinnvoll, dem Namespace überflüssige Module hinzuzufügen. – wwii

-1
data.csv: 
''' 
one, two, three 
1,2,3 
4,5,6 
7,8,9 
10,11,12 
''' 

Verwenden Sie ein Ebene Reader-Objekt, die Header erhalten, die Daten transponieren, kombinieren die Header mit den Daten eines dict zu erstellen.

import csv 
with open('data.csv') as f: 
    reader = csv.reader(f) 
    headers = next(reader) 
    # transpose the data 
    # --> columns become rows and rows become columns 
    data = zip(*reader) 
    # create a dictionary by combining the headers with the data 
    d = dict(zip(headers, data)) 

>>> from pprint import pprint 
>>> pprint(d) 
{' three': ('3', '6', '9', '12'), 
' two': ('2', '5', '8', '11'), 
'one': ('1', '4', '7', '10')} 
>>> 
+0

Ein weiterer Downvote ohne Erklärung, der mich daran hindert, einen wahrgenommenen Fehler zu korrigieren. – wwii