Was ist die pythonic way zu Lesen CSV-Datei Daten als Reihen von namedtuples?
Was ist der beste Weg, um eine Daten-Datei enthält eine header-Zeile und Lesen Sie diese Zeilen in eine named Tupel, so dass die Daten-Zeilen können aufgerufen werden, indem Sie header-Namen?
Ich war versucht, so etwas wie dieses:
import csv
from collections import namedtuple
with open('data_file.txt', mode="r") as infile:
reader = csv.reader(infile)
Data = namedtuple("Data", ", ".join(i for i in reader[0]))
next(reader)
for row in reader:
data = Data(*row)
Das reader-Objekt ist nicht subscriptable, so dass der obige code löst eine TypeError
. Was ist die pythonic way-Leser-eine-Datei-header in eine namedtuple?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden:
weglassen und die Zeile:
Kombinieren Sie dies mit einer iterative version, basierend auf martineau ' s Kommentar, das Beispiel wird für Python 2
und für Python 3
for data in map(Data._make, reader):
.namedtuple
s kann man einfach erklären, dienamedtuple
Typ statisch mit festen Feldnamen stattnext(reader)
. Der rest des Codes bleibt die gleiche.mode="rb"
erforderlich ist, während in Python 3newline=""
erforderlich ist.newline=""
ist nur nützlich für einige alte Versionen von python 3, die insert 1 Leerzeile nach jeder Zeile (das gleiche gilt für die neuesten releases 2.7 wo"rb"
ist nicht erforderlich. Überprüfen Sie meine F&A: "stackoverflow.com/questions/38808284/... und testen Sie es selbst.open("data_file.txt")
(beim Lesen) funktioniert für jede version von python. Schreiben ist etwas anderes, aber scheint ok zu sein, ohne Zeilenumbruch oder wb in späteren Versionen von entweder 2 oder 3 Zweig.b
tatsächlich einen Unterschied macht, und ich glaube nicht, dass es notwendig ist. Sowohl das neueste Python 2 und Python 3 Dokumentationen für diecsv
Modul Staat diese Anforderungen, so dass selbst wenn Sie fand, dass es passiert zu arbeiten auf einigen Plattformen für einige Eingänge, die Sie immer noch mit der API in eine nicht dokumentierte Möglichkeit, die brechen könnte, jederzeit.lambda
hier, anstelle von protected-Methode:map(lambda i: Data(*i), reader)
map()
mit lambda ist verpönt in Python. Es ist unnötig langsam und besser ausgedrückt als eine Liste Verständnis.pandas
CSV-reader statt aus der standard-Bibliothek. Wenn Sie verwenden möchten, die von der standarad lib, können Sie manuell konvertieren Sie die Daten, z.B.converters = [int, str, float]; row = [conv(x) for conv, x in zip(converters, row)]
. Benötigen Sie eine Fehlerbehandlung, natürlich.Bitte haben Sie einen Blick auf
csv.DictReader
. Im Grunde, es bietet die Möglichkeit zu bekommen, werden die Spaltennamen aus der ersten Zeile, wie Sie suchen und, danach, Sie können auf jede Spalte in eine Zeile von Namen mit einem Wörterbuch.Wenn Sie aus irgendeinem Grund immer noch zugreifen zu können, müssen die Zeilen wie ein
collections.namedtuple
es sollte leicht zu transformieren die Wörterbücher benannten Tupel wie folgt: