Daten in neue Datei schreiben

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
helloworld1911
User
Beiträge: 5
Registriert: Mittwoch 10. Februar 2021, 19:16

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
bb1898
User
Beiträge: 216
Registriert: Mittwoch 12. Juli 2006, 14:28

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
helloworld1911
User
Beiträge: 5
Registriert: Mittwoch 10. Februar 2021, 19:16

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
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
bb1898
User
Beiträge: 216
Registriert: Mittwoch 12. Juli 2006, 14:28

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.
helloworld1911
User
Beiträge: 5
Registriert: Mittwoch 10. Februar 2021, 19:16

@__blackjack__ leider ist das Format tatsächlich so "schön" von der Struktur aufgebaut - aber abwechselnd gespeichert.
Antworten