Ich fordere Python auf, die Mindestanzahl aus einer Spalte mit CSV-Daten zu drucken, aber die oberste Zeile ist die Spaltennummer, und ich möchte nicht, dass Python die oberste Zeile berücksichtigt. Wie kann ich sicherstellen, dass Python die erste Zeile ignoriert?
Dies ist der bisherige Code:
import csv
with open('all16.csv', 'rb') as inf:
incsv = csv.reader(inf)
column = 1
datatype = float
data = (datatype(column) for row in incsv)
least_value = min(data)
print least_value
Können Sie auch erklären, was Sie tun, und nicht nur den Code angeben? Ich bin sehr, sehr neu in Python und möchte sicherstellen, dass ich alles verstehe.
1.0
für jede Zeile in Ihrer Datei ein a zurückgibt und dann das Minimum nimmt, das sein wird1.0
?1.0
. :)datatype(row[column]
... ist das, was das OP allerdings zu erreichen versuchtAntworten:
Sie können eine Instanz der
csv
Modulklasse verwendenSniffer
, um das Format einer CSV-Datei abzuleiten und festzustellen, ob eine Kopfzeile vorhanden ist, sowie die integriertenext()
Funktion, um die erste Zeile nur bei Bedarf zu überspringen:Da
datatype
undcolumn
in Ihrem Beispiel fest codiert sind, wäre es etwas schneller, Folgendes zu verarbeitenrow
:Hinweis: Der obige Code gilt für Python 3.x. Verwenden Sie für Python 2.x die folgende Zeile, um die Datei anstelle der angezeigten zu öffnen:
quelle
has_header(file.read(1024))
es sinnvoll, stattdessen zu schreibenhas_header(file.readline())
? Ich sehe das sehr oft, aber ich verstehe nicht, wie ichhas_reader()
feststellen kann, ob es einen Header aus einer einzelnen Zeile der CSV-Datei gibt oder nicht ...Sniffer
Arbeiten nicht beschrieben. FWIW Ich habe noch nie gesehen,has_header(file.readline())
dass es verwendet wird, und selbst wenn es die meiste Zeit funktioniert hätte, wäre ich aus den genannten Gründen sehr misstrauisch gegenüber dem Ansatz.file.read(1024)
Fehlern in der csv lib von Python zu generieren :. Siehe auch hier zum Beispiel.readline()
zu gewechselt binread(1024)
. Bisher habe ich nur Leute gefunden, die zu readline gewechselt sind, um das Problem mit csv.dialect zu lösen.Um die erste Zeile zu überspringen, rufen Sie einfach an:
Dateien in Python sind Iteratoren über Zeilen.
quelle
In einem ähnlichen Anwendungsfall musste ich nervige Zeilen vor der Zeile mit meinen tatsächlichen Spaltennamen überspringen. Diese Lösung hat gut funktioniert. Lesen Sie zuerst die Datei und übergeben Sie die Liste an
csv.DictReader
.quelle
data
Wörterbuch erstellen, und diese Antwort fügt auch nichts über das akzeptierte hinzu.data = dict()
und auszufüllen, aber es ist ineffizient und nicht idiomatisch. Außerdem sollte man dikt Literale ({}
) verwenden undenumerate
auch dann.@Veedrac
wenn Sie sicher sein möchten, dass ich benachrichtigt werde, obwohl Stack Overflow den Benutzernamen zu erraten scheint. (Ich schreibe nicht,@Maarten
weil der Antwortende standardmäßig benachrichtigt wird.)Aus dem Python-Kochbuch entlehnt , könnte
ein prägnanterer Vorlagencode folgendermaßen aussehen:
quelle
Normalerweise wird verwendet,
next(incsv)
wodurch der Iterator um eine Zeile vorgerückt wird, sodass Sie den Header überspringen. Die andere (sagen wir, Sie wollten 30 Zeilen überspringen) wäre:quelle
Verwenden Sie csv.DictReader anstelle von csv.Reader. Wenn der Parameter Feldnamen weggelassen wird, werden die Werte in der ersten Zeile der CSV-Datei als Feldnamen verwendet. Sie können dann mit Zeile ["1"] usw. auf Feldwerte zugreifen
quelle
Das neue 'Pandas'-Paket ist möglicherweise relevanter als' csv '. Der folgende Code liest eine CSV-Datei, interpretiert standardmäßig die erste Zeile als Spaltenüberschrift und ermittelt das Minimum über Spalten hinweg.
quelle
pd.read_csv('all16.csv').min()
Nun, meine Mini-Wrapper-Bibliothek würde den Job auch machen.
Wenn Sie wissen, um welchen Header-Spaltenindex es sich handelt, z. B. "Spalte 1", können Sie dies stattdessen tun:
quelle
Für mich ist es am einfachsten, die Reichweite zu nutzen.
quelle
Da dies mit etwas zusammenhängt, das ich getan habe, werde ich es hier teilen.
Was ist, wenn wir nicht sicher sind, ob es einen Header gibt und Sie auch keine Lust haben, Sniffer und andere Dinge zu importieren?
Wenn Ihre Aufgabe grundlegend ist, z. B. Drucken oder Anhängen an eine Liste oder ein Array, können Sie einfach eine if-Anweisung verwenden:
quelle
Die Dokumentation zum Python 3 CSV-Modul enthält dieses Beispiel:
Der
Sniffer
wird versuchen, viele Dinge über die CSV-Datei automatisch zu erkennen. Sie müssen diehas_header()
Methode explizit aufrufen , um festzustellen, ob die Datei eine Kopfzeile enthält. Wenn dies der Fall ist, überspringen Sie die erste Zeile, wenn Sie die CSV-Zeilen durchlaufen. Sie können es so machen:quelle
Ich würde Schwanz verwenden , um die unerwünschte erste Zeile loszuwerden:
quelle
füge einfach [1:] hinzu
Beispiel unten:
das funktioniert bei mir in iPython
quelle
Python 3.X.
Behandelt UTF8 BOM + HEADER
Es war ziemlich frustrierend, dass das
csv
Modul den Header nicht leicht bekommen konnte, es gibt auch einen Fehler mit der UTF-8-Stückliste (erstes Zeichen in der Datei). Dies funktioniert bei mir nur mit demcsv
Modul:quelle
Ich würde csvreader in list konvertieren und dann das erste Element einfügen
quelle
Python 2.x.
csvreader.next()
Python 3.x.
csvreader.__next__()
quelle