2012-11-10 18 views
7

sie haben eine CSV-Tabelle mit Zeilen- und Spaltenüberschriften zu lesen, zum Beispiel:A Pythonic Weg CSV mit Zeilen- und Spaltenüberschriften

, "Car", "Bike", "Boat", "Plane", "Shuttle" 
"Red", 1, 7, 3, 0, 0 
"Green", 5, 0, 0, 0, 0 
"Blue", 1, 1, 4, 0, 1 

Ich mag Zeilen- und Spaltenüberschriften erhalten, das heißt:

col_headers = ["Car", "Bike", "Boat", "Plane", "Shuttle"] 
row_headers = ["Red", "Green", "Blue"] 
data = [[1, 7, 3, 0, 0], 
     [5, 0, 0, 0, 0], 
     [1, 1, 4, 0, 1]] 

natürlich kann ich so etwas wie

import csv 
with open("path/to/file.csv", "r") as f: 
    csvraw = list(csv.reader(f)) 
col_headers = csvraw[1][1:] 
row_headers = [row[0] for row in csvraw[1:]] 
data = [row[1:] for row in csvraw[1:]] 

tun ... aber es Pythonic sieht nicht genug.

Gibt es einen besseren Weg für diesen natürlichen Betrieb?

+0

Was ist 'csvraw'? – martineau

+0

@martineau Es gab einen Fehler in meinem Code. 'csvraw = list (csv.reader (f))'. –

Antwort

2

Werfen Sie einen Blick auf csv.DictReader.

Wenn der Parameter fieldnames weggelassen wird, werden die Werte in der ersten Zeile der csvfile als Feldnamen verwendet.

Dann können Sie einfach reader.fieldnames tun. Dies gibt natürlich nur Spaltenüberschriften. Sie müssten die Zeilenköpfe immer noch manuell analysieren.

Ich denke, Ihre ursprüngliche Lösung ist jedoch ziemlich gut.

0

Ich bin mir bewusst, dass diese Lösung Ihnen ein anderes Ausgabeformat als die angeforderte gibt, aber ist es sehr bequem. Dieser liest die CSV-Zeile in ein Wörterbuch:

reader = csv.reader(open(parameters_file), dialect) 

keys = [key.lower() for key in reader.next()] 
for line in reader: 
    parameter = dict(zip(keys, cells)) 
+0

Warum würden Sie dies posten, wenn ich bereits über '' DictReader'' gepostet habe, was dies ohne die Notwendigkeit tut, es manuell zu tun? –

+0

@Lattyware, weil es Ihnen ermöglicht, das Feld zu transformieren. Zum Beispiel machen Sie sie zu einem Schlüssel oder filtern sie sogar. –

2

Jetzt sehe ich, dass ich will, was ist der einfachste (und die robusteste) mit Pandas zu erreichen.

import pandas as pd 
df = pd.read_csv('foo.csv', index_col=0) 

Und wenn ich will, ist es leicht zu extrahieren:

col_headers = list(df.columns) 
row_headers = list(df.index) 

Ansonsten in dem „rohen“ Python, so scheint es, dass die Methode, die ich in der Frage schrieb „gut genug“ ist.

0

ohne 3rd-Party-Libs (und wenn Sie mit den Ergebnissen sein Tupel aus dem zip op leben können):

import csv 

with open('your_csv_file') as fin: 
    csvin = csv.reader(fin, skipinitialspace=True) 
    col_header = next(csvin, [])[1:] 
    row_header, data = zip(*((row[0], row[1:]) for row in csvin)) 

Gibt Ihnen für col_header, row_header und data:

['Bike', 'Boat', 'Plane', 'Shuttle'] 
('Red', 'Green', 'Blue') 
(['1', '7', '3', '0', '0'], ['5', '0', '0', '0', '0'], ['1', '1', '4', '0', '1']) 
0

Zustimmen, Pandas ist das Beste, was ich auch gefunden habe. Ich bin daran interessiert, spezifische Werte meines Datenrahmens zu lesen. Hier ist, was ich getan habe:

import pandas as pd 
d=pd.read_csv(pathToFile+"easyEx.csv") 
print(d) 
print(d.index.values) 
print(d.index.values[2]) 
print(d.columns.values) 
print(d.columns.values[2]) 
print(pd.DataFrame(d,index=['Blue'],columns=['Boat'])+0.333) 

Und das ist, was es gibt:

  Car Bike Boat Plane Shuttle                            
Red  1  7  3  0  0                            
Green 5  0  0  0  0                            
Blue  1  1  4  0  1                            
['Red' 'Green' 'Blue']                                
Blue                                    
['Car' 'Bike' 'Boat' 'Plane' 'Shuttle']                           
Boat                                    
     Boat                                   
Blue  4.333        

Bitte beachte, dass ich Zeilennamen mit ‚index‘ überprüfen und Spaltennamen mit ‚Spalten‘. Beachten Sie auch, dass ich ein bestimmtes Element der "Datenrahmen" -Basis in seinen Zeilen- und Spaltennamen lesen kann, und dass die Werte immer noch numerisch sind, weshalb ich im letzten Druck '+0,333' hinzugefügt habe.

Ich chagte die Datendatei, entfernte ich die Anführungszeichen ("") und Leerzeichen nach Kommas in der ersten Zeile. Hier können Sie 'easyEx.csv' Datei:

Car,Bike,Boat,Plane,Shuttle 
Red, 1, 7, 3, 0, 0 
Green, 5, 0, 0, 0, 0 
Blue, 1, 1, 4, 0, 1 

Hope this helfen =)

Verwandte Themen