Seite 1 von 1
Daten in neue Datei schreiben
Verfasst: Samstag 13. Februar 2021, 15:38
von helloworld1911
Hey,
hab da mal eine Frage bzgl. Daten in txt/csv schreiben.
Konkret geht es um folgendes:
Code: Alles auswählen
for inhalt, city in zip(root.iter("offer"), root.iter("location")):
titel = inhalt.find("title").text
area = inhalt.find("area").text
cities = city.find("city").text
list = titel, area, cities
file = open("testdatei.csv", "w")
str_dictionary = repr(list)
file.write(str_dictionary + "\n")
file.close()
Wenn ich hier nun die Datei "testdatei.csv" oder "testdatei.txt" mit "w" bearbeite, funktioniert das zwar aber es wird immer nur die letzte Zeile der for-Schleife in die Datei geschrieben und gespeichert.
Wenn ich aber "a" zum schreiben benutze, werden alle Inhalte aus der for Schleife geschrieben und gespeichert.
Evtl. kann mir hier jemand einen Tipp geben, wie ich die Datei mit "w" speichern kann?
Möchte nicht, dass aus dem xml-feed immer alle Inhalte einfach angehängt werden, sondern die Datei beim neuen öffnen mit den neuen, gefilterten Inhalten überschrieben wird.
VG
Re: Daten in neue Datei schreiben
Verfasst: Samstag 13. Februar 2021, 20:17
von bb1898
Du erzeugst und schließt die Datei in jedem Schleifendurchgang neu, da wird jedesmal die vorige Version überschrieben. Wenn Du Öffnen und Schließen der Datei aus der Schleife herausziehst, sollte es klappen. Und am besten die Datei mit "with ..." öffnen, dann schließt sie sich am Ende automatisch. Ungefähr so:
Code: Alles auswählen
with open("testdatei.csv", "w", encoding="utf-8") as file:
for inhalt, city in zip(root.iter("offer"), root.iter("location")):
# Rest wie gehabt, aber ohne die Zeilen "file = ..." und "file.close()"
Ich habe gleich mal ein vernünftiges Encoding zugefügt.
Re: Daten in neue Datei schreiben
Verfasst: Samstag 13. Februar 2021, 21:23
von __blackjack__
@helloworld1911: Du nennst ein Tupel `list` und wandelst das Tupel das Du `list` genannt hast in eine Zeichenkette um und nennst die dann `str_dictionary`. Verwirrender geht kaum.
Locations nennst Du `city` und den einen <city>-Wert den Du da heraus holst nennst Du dann `cities`. <offer>-Tags werden `inhalt` genannt. Du musst echt an der Namensgebung arbeiten.
Die `repr()`-Darstellung eines Tupels ergibst kein CSV. Wenn man CSV-Dateien schreiben will, dann hat Python dafür das `csv`-Modul in der Standardbibliothek. Da bitte in der Dokumentation nachsehen welche Argumente man beim öffnen der Datei benötigt.
Ich habe den starken Verdacht das <offer>- und <location>-Elemente ein gemeinsames Elternelement haben. Über *diese* Elemenet sollte man in der Schleife iterieren, statt zwei *hoffentlich* ”parallel” laufende iterierbare Objekte mit `zip()` zu verbinden.
Re: Daten in neue Datei schreiben
Verfasst: Sonntag 14. Februar 2021, 18:37
von helloworld1911
Erstmal danke an das Forum hier wirklich super. Beschäftige mich jetzt erst seit paar Wochen mit Python und ab und zu kommen so Feinheiten auf.
@bb1898 vielen Dank, für deinen Tipp - es hat funktioniert. Hatte das auch probiert gehabt, die Datei außerhalb der Schleife zu platzieren, jedoch danach. xD
@__blackjack__ auch dir vielen Dank für die Tipps. Hab den Code nun auch nochmals bzgl. der Betitelung angepasst.
Bzgl. der xml-Datei sieht die Struktur so aus (hier kann ich an der Struktur leider nichts ändern):
<anfang>
<offers>
<offer>
<title></title>
<area></area>
....
</offer>
<location>
<city></city>
....
</location>
</offers>
</anfang>
Funktioniert das Zusammenfassen hier auch über eine Schleife?
VG
Re: Daten in neue Datei schreiben
Verfasst: Sonntag 14. Februar 2021, 19:18
von __blackjack__
@helloworld1911: Ich kann mir schwer vorstellen, dass das Format wirklich so be… äh, ungünstig aufgebaut ist, das in <offers> tatsächlich <offer> und <location> als direkte Kinder gespeichert sind, und das dann auch noch gleich viele die in der Reihenfolge in der sie auftauchen jeweils zu einem Angebot zusammengehören.
Hier das ganze nochmal mit sichtbarer Einrückung:
Code: Alles auswählen
<anfang>
<offers>
<offer>
<title></title>
<area></area>
....
</offer>
<location>
<city></city>
....
</location>
</offers>
</anfang>
Sind die Angebote und Standorte wenigstens abwechselnd gespeichert oder erst alle Angebote und dann alle Standorte?
Re: Daten in neue Datei schreiben
Verfasst: Sonntag 14. Februar 2021, 19:41
von bb1898
helloworld1911 hat geschrieben: Sonntag 14. Februar 2021, 18:37
@bb1898 vielen Dank, für deinen Tipp - es hat funktioniert. Hatte das auch probiert gehabt, die Datei außerhalb der Schleife zu platzieren, jedoch danach. xD
Auch das wäre durchaus machbar, Du müsstest dann nur die Daten, die in die Datei sollen, innerhalb der Schleife in eine Liste schreiben - und diese Liste vor der Schleife initialisieren, sonst hast Du das alte Problem wieder. Ob das aber im gegebenen Zusammenhang eine gute Idee ist, kannst nur Du beurteilen.
Re: Daten in neue Datei schreiben
Verfasst: Montag 15. Februar 2021, 10:50
von helloworld1911
@__blackjack__ leider ist das Format tatsächlich so "schön" von der Struktur aufgebaut - aber abwechselnd gespeichert.