Hallo zusammen,
ich bin gerade dabei mir selber etwas python beizubringen und stecke bei dem Import einer txt-Datei fest. Ich würde die txt-Datei gerne zeilenweise einlesen.
Das Problem ist, dass die txt-Datei nicht als erste Zeile die Spaltenüberschriften enthält, sondern vor jedem Wert einzeln die "Überschrift" davor steht. Bsp. "Datum": 07.01.2019, "Anzahl": 27, ... , "Datum": 06.01.2019,..., "Bemerkung": "Bitte beachten, dass..."
Als Seperator werden Kommas verwendet, das führt zu dem Problem, dass in manchen Werten, in denen Sätze abgespeichert werden die normalen Kommas als Trennzeichen interpretiert werden und ich somit den Fehler "Error tokenizing data. C error: Expected 40 fields in line 5, saw 48" bekomme.
Am liebsten würde ich automatisiert die Überschriften herauslöschen und als erste Zeile einfügen lassen, außerdem sollte er die Kommas in den Anführungszeichen ignorieren.
Gibt es hierfür eine elegante Lösung? Oder eine die zumindest funktioniert
Wäre super wenn mir jemand helfen könnte!
Vielen Dank schon mal!
Viele Grüße,
Max
TXT Datei einlesen
Das Problem ist, dass wenn die Kommas nicht explizit gekennzeichnet sind, das Format nicht eindeutig ist, man es also nicht automatisiert lesen kann. So wie es aber aussieht, sind die Felder mit Kommas noch zusätzlich in " eingefasst, wobei da noch die Frage bliebe, wie dann " im Bemerkungsfeld kodiert sind und ob es Zeilenumbrüche geben kann. Pandas an sich unterstützt quoating per default, kommt aber wahrscheinlich mit den Keys nicht zurecht.
Ist denn Reihenfolge und Anzahl der Keys in jeder Zeile gleich?
Das stabilste wäre es wohl, die Datei selbst, per Regulärem Ausdruck zu parsen.
Ist denn Reihenfolge und Anzahl der Keys in jeder Zeile gleich?
Das stabilste wäre es wohl, die Datei selbst, per Regulärem Ausdruck zu parsen.
-
- User
- Beiträge: 4
- Registriert: Montag 7. Januar 2019, 11:50
Danke für deine schnelle Antwort
Ja die Reihenfolge und Anzahl der Keys ist pro Zeile immer gleich. Zeilenumbrüche innerhalb der Werte gibt es keine.
Was bedeutet "..selbst, per Regulärem Ausdruck zu parsen"?
Gibt es eine Möglichkeit die Keys vorher zu definieren und dann zu definieren, dass alles was bis zum nächsten Key kommt der Value sein soll?
Ja die Reihenfolge und Anzahl der Keys ist pro Zeile immer gleich. Zeilenumbrüche innerhalb der Werte gibt es keine.
Was bedeutet "..selbst, per Regulärem Ausdruck zu parsen"?
Gibt es eine Möglichkeit die Keys vorher zu definieren und dann zu definieren, dass alles was bis zum nächsten Key kommt der Value sein soll?
- __blackjack__
- User
- Beiträge: 13103
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Neuling2018: Wo kommen diese Daten denn her? Und ist das wirklich exakt so wie Du es gezeigt hast? Ich würde gerne ausschliessen das Du eigentlich JSON oder „JSON lines“ hast und das hier nur so ungefähr abgetippt hast.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
-
- User
- Beiträge: 4
- Registriert: Montag 7. Januar 2019, 11:50
Das sind Dummy-Daten, die ich im Internet gefunden habe, wie gesagt ich möchte nur ein bisschen lernen
Du hast Recht, es stand etwas mit JSON dabei, ich wusste nicht, dass das relevant sein könnte. Tut mir leid, wenn ich etwas wichtiges ausgelassen habe
Ich nehme an, dass ich dann json und csv importieren muss und beim googlen habe ich gesehen, dass ich den csv.DictWriter verwenden muss. Bin ich hier auf der richtigen Spur? Irgendwie bekomme ich den Code nicht richtig hin...
Du hast Recht, es stand etwas mit JSON dabei, ich wusste nicht, dass das relevant sein könnte. Tut mir leid, wenn ich etwas wichtiges ausgelassen habe
Ich nehme an, dass ich dann json und csv importieren muss und beim googlen habe ich gesehen, dass ich den csv.DictWriter verwenden muss. Bin ich hier auf der richtigen Spur? Irgendwie bekomme ich den Code nicht richtig hin...
-
- User
- Beiträge: 4
- Registriert: Montag 7. Januar 2019, 11:50
okay, ich glaube jetzt habe ich es geschafft:
input = []
for line in open('test.txt', 'r'):
input.append(json.loads(line))
df = pd.DataFrame(input)
Wahrscheinlich nicht schön und effizient aber so sieht das Ergebnis ganz passabel aus
Danke für euren Input!
input = []
for line in open('test.txt', 'r'):
input.append(json.loads(line))
df = pd.DataFrame(input)
Wahrscheinlich nicht schön und effizient aber so sieht das Ergebnis ganz passabel aus
Danke für euren Input!
input ist eine Python Funktion, die als Variablenname zu verwenden ist nicht zu empfehlen.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png