Gibt es eine pythonische Möglichkeit, um herauszufinden, welche Zeilen in einer CSV-Datei Header und Werte enthalten und welche Zeilen Papierkorb enthalten und dann die Header/Werte Zeilen in Datenrahmen?Python pandas: lesen csv mit mehreren Tabellen wiederholt Präambel
Ich bin relativ neu zu Python und habe es verwendet, um mehrere CSVs aus dem Datenprotokoll eines wissenschaftlichen Instruments zu lesen, und wenn CSVs bisher für andere Aufgaben zu behandeln, habe ich immer standardmäßig die pandas
Bibliothek verwendet. Diese CSV-Exporte können jedoch abhängig von der Anzahl der "Tests" variieren, die an jedem Gerät protokolliert werden.
Die Spaltenüberschriften und die Datenstruktur sind zwischen den Geräten gleich, aber es gibt eine "Präambel", die jeden Test trennt, der sich ändern kann. So habe ich am Ende mit Backups auf, die wie folgt aussehen (in diesem Beispiel gibt es zwei Tests, aber es könnte sein, möglicherweise eine beliebige Anzahl von Tests):
blah blah here's a test and
here's some information
you don't care about
even a little bit
header1, header2, header3
1, 2, 3
4, 5, 6
oh you have another test
here's some more garbage
that's different than the last one
this should make
life interesting
header1, header2, header3
7, 8, 9
10, 11, 12
13, 14, 15
Wenn es sich um eine feste Länge Präambel jedes Mal war ich würde Verwenden Sie einfach den Parameter skiprow, aber die Präambel hat eine variable Länge und die Anzahl der Zeilen in jedem Test ist von variabler Länge.
Mein Endziel ist es, alle Tests verschmelzen und mit so etwas wie am Ende:
header1, header2, header3
1, 2, 3
4, 5, 6
7, 8, 9
10, 11, 12
13, 14, 15
Was ich kann dann mit Pandas wie gewohnt bearbeiten.
Ich habe das versucht, im Anschluss an die erste Reihe mit meinen erwarteten Header zu finden:
import csv
import pandas as pd
with open('my_file.csv', 'rb') as input_file:
for row_num, row in enumerate(csv.reader(input_file, delimiter=',')):
# The CSV module will return a blank list []
# so added the len(row)>0 so it doesn't error out
# later when searching for a string
if len(row) > 0:
# There's probably a better way to find it, but I just convert
# the list to a string then search for the expected header
if "['header1', 'header2', 'header3']" in str(row):
header_row = row_num
df = pd.read_csv('my_file.csv', skiprows = header_row, header=0)
print df
Dies funktioniert, wenn ich nur einen Test, weil es die erste Zeile findet, die Header, aber natürlich auch die header_row
Variable wird immer jede zusätzliche Zeit aktualisiert es den Header findet, so in dem obigen Beispiel I mit Ausgang am Ende:
header1 header2 header3
0 7 8 9
1 10 11 12
2 13 14 15
ich bin verloren, herauszufinden, wie jede Instanz des Headers/Datensatz zu einem anhang Datenframe, bevor Sie weiter suchen g für die nächste Instanz des Headers/Datasets.
Und es ist wahrscheinlich nicht super effizient, wenn man mit einer großen Anzahl von Dateien zu tun, um es einmal mit dem csv
Modul dann wieder mit pandas
zu öffnen.
Woher wissen Sie, was ist eine Überschrift und was ist Präambel? Wenn Kommas beginnen in der Präambel, dann sind Sie verloren ... – Chiel
Nun, die Header sind mindestens Standard im Namen durch, so dass Sie wissen, dass die Header sind in welcher Zeile enthält 'header1, header2, header3' und die tatsächliche Datenmenge ist die Zeilen unmittelbar nach der Kopfzeile. Die Frage ist, wie man die Zeilen, die Header/Daten haben, aussortiert und in einen Datenrahmen bringt und den Rest ignoriert. –
Vereinbart mit Chiel, die Kommata in der Einleitung sind das Risiko - wenn Sie wissen, dass Sie nicht die gleiche Anzahl von Kommas in jeder Zeile in der Präambel haben, die Sie in Ihren Daten haben, mit len (Zeile), um sie zu filtern out ist einfach. –