TXT Datei einlesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Neuling2018
User
Beiträge: 4
Registriert: Montag 7. Januar 2019, 11:50

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 :D

Wäre super wenn mir jemand helfen könnte!

Vielen Dank schon mal!

Viele Grüße,
Max
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Neuling2018
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?
Benutzeravatar
__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
Neuling2018
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...
Neuling2018
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!
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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
Antworten