2016-09-25 3 views
0

Ich versuche, in einer CSV-Datei zu lesen und dann alle Werte aus jeder Spalte und in eine separate Liste aufzunehmen. Ich möchte die Werte nicht nach Zeilen. Da der CSV-Reader nur ein einziges Durchlaufen der Datei erlaubt, verwende ich die seek() -Methode, um zum Anfang zurückzugehen und die nächste Spalte zu lesen. Gibt es neben der Verwendung eines Dict-Mappings einen besseren Weg, dies zu tun?Alle Spalten aus der CSV-Datei lesen?

infile = open(fpath, "r") 
reader = csv.reader(infile)  

NOUNS = [col[0] for col in reader] 
infile.seek(0) # <-- set the iterator to beginning of the input file 

VERBS = [col[1] for col in reader] 
infile.seek(0) 
ADJECTIVES = [col[2] for col in reader] 
infile.seek(0) 
SENTENCES = [col[3] for col in reader] 

Antwort

1

So etwas wie dies tun würde am Ende in einem Durchgang tun:

kinds = NOUNS, VERBS, ADJECTIVES, SENTENCES = [], [], [], [] 
with open(fpath, "r") as infile: 
    for cols in csv.reader(infile): 
     for i, kind in enumerate(kinds): 
      kind.append(cols[i]) 
1

Sie könnten die reader-zip füttern und sie entpacken Variablen, wie Sie wollen.

import csv 

with open('input.csv') as f: 
    first, second, third, fourth = zip(*csv.reader(f)) 
    print('first: {}, second: {}, third: {}, fourth: {}'.format(
     first, second, third, fourth 
    )) 

mit folgenden Eingabe:

1,2,3,4 
A,B,C,D 

Es Ausgabe produzieren:

first: ('1', 'A'), second: ('2', 'B'), third: ('3', 'C'), fourth: ('4', 'D') 
0

Ich bin nicht sicher, warum Sie nicht wollen, dict-Mapping verwenden. Dies ist, was ich

Daten

col1,col2,col3 
val1,val2,val3 
val4,val5,val6 

-Code

import csv 
d = dict() 
with open("abc.text") as csv_file: 
    reader = csv.DictReader(csv_file) 
    for row in reader: 
     for key, value in row.items(): 
      if d.get(key) is None: 
       d[key] = [value] 
      else: 
       d[key].append(value) 

print d 
{'col2': ['val2', 'val5'], 'col3': ['val3', 'val6'], 'col1': ['val1', 'val4']} 
+0

Dies setzt voraus, dass die erste Zeile eine Kopfzeile ist. Unabhängig davon können Sie das 'if/else' durch eine Zeile ersetzen:' d.setdefault (key, []). Append (value) '. – martineau

+0

Ja, ich habe die erste Zeile als Header angenommen. Danke, dass Sie mir von 'setdefaultkey' erzählt haben. –

1

Dies funktioniert vorausgesetzt, du weißt es genau wie viele Spalten sind in der CSV (und es gibt keine Kopfzeile).

NOUNS = [] 
VERBS = [] 
ADJECTIVES = [] 
SENTENCES = [] 
with open(fpath, "r") as infile: 
    reader = csv.reader(infile)  

    for row in reader: 
     NOUNS.append(row[0]) 
     VERBS.append(row[1]) 
     ADJECTIVES.append(row[2]) 
     SENTENCES.append(row[3]) 

Wenn Sie die Spaltenüberschriften nicht wissen, Sie gehen klug und abzulesen die erste Reihe, machen Listen für jede Spalte, die Sie treffen, und eine Schleife durch jede neue Zeile und stecken in haben sein die entsprechende Liste. Sie müssen wahrscheinlich eine Liste von Listen erstellen.

Wenn es Ihnen nichts ausmacht, eine Abhängigkeit hinzuzufügen, verwenden Sie Pandas. Verwenden Sie eine DataFrame und die Methode read_csv(). Zugriff auf jede Spalte unter Verwendung des Spaltennamens, d. H.

df = pandas.DataFrame.read_csv(fpath) 
print df['NOUN'] 
print df['VERBS'] 
+0

Sie können die Kopfzeile überspringen, wenn Sie die' csv.Sniffer' Klasse verwenden, wie in dieser [Antwort] (http://stackoverflow.com/a/11350095/355230) gezeigt. – martineau

Verwandte Themen