Liste untereinander in Txt-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
Lara99
User
Beiträge: 3
Registriert: Montag 14. November 2022, 20:43

Guten Abend zusammen,

ich habe ein Programm geschrieben, welches mit Hilfe des Moduls "Duden" für jedes Wort die Synonyme ausgibt. Es sieht folgender Maßen aus:

Code: Alles auswählen

import duden

list = ["Blume", "Garten", "Sonne"]
result = []
for word in list:
        
        w = duden.get(word)
        if w is not None:
                result.append(word)
                result.append(w.synonyms)
print(result)
Als Ergebnis des Programms bekommt man eine Liste (result), die so aussieht:

Code: Alles auswählen

 ['Blume', ['Blumenstock, Pflanze, Topfblume, Topfpflanze'],
 'Garten', ['englischer Garten, Grünanlage, grüne Lunge, Grünfläche'],
 'Sonne', ['Sonnenscheibe; (gehoben) Tagesgestirn; (griechische Mythologie) Helios, Helligkeit']]

Ich möchte nun den Inhalt der Liste (result) folgender Maßen in eine Textdatei abspeichern:

Code: Alles auswählen

Blume, Blumenstock, Pflanze, Topfblume, Topfpflanze
Garten , englischer Garten, Grünanlage, grüne Lunge, Grünfläche
Sonne, Sonnenscheibe, (gehoben) Tagesgestirn, (griechische Mythologie) Helios, Helligkeit
Weiß jemand vielleicht wie das geht? Es wäre sehr nett, wenn mir jemand helfen könnte.

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

`list` ist der Name der Python-List-Klasse und sollte nicht mit eigenen Werten überdeckt werden. `words` wäre ein viel besserer Variablenname. `w` ist auch ein schlechter Variablenname, weil einbuchstabige Namen nichts aussagen. Laut Dokumentation liefert `get` ein DudenWort-Objekt
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 8.
Der Aufbau von `results` ist schlecht, weil jeder zweite Eintrag eine andere Bedeutung hat. Besser ist es, word und w.synonyms gemeinsam in einem Tuple `results` hinzuzufügen.

Code: Alles auswählen

import duden

words = ["Blume", "Garten", "Sonne"]
result = []
for word in words:
    duden_work = duden.get(word)
    if duden_word is not None:
        result.append((word, duden_word..synonyms))
print(result)
Was hast Du schon über das Schreiben in Dateien gelernt? An welcher Stelle kommst Du damit konkret nicht weiter?
Nach welcher Regel soll vor dem ersten Komma ein Leerzeichen gesetzt werden und wann nicht?
Lara99
User
Beiträge: 3
Registriert: Montag 14. November 2022, 20:43

Sirius3 hat geschrieben: Montag 14. November 2022, 22:01 `list` ist der Name der Python-List-Klasse und sollte nicht mit eigenen Werten überdeckt werden. `words` wäre ein viel besserer Variablenname. `w` ist auch ein schlechter Variablenname, weil einbuchstabige Namen nichts aussagen. Laut Dokumentation liefert `get` ein DudenWort-Objekt
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 8.
Der Aufbau von `results` ist schlecht, weil jeder zweite Eintrag eine andere Bedeutung hat. Besser ist es, word und w.synonyms gemeinsam in einem Tuple `results` hinzuzufügen.

Code: Alles auswählen

import duden

words = ["Blume", "Garten", "Sonne"]
result = []
for word in words:
    duden_work = duden.get(word)
    if duden_word is not None:
        result.append((word, duden_word..synonyms))
print(result)
Was hast Du schon über das Schreiben in Dateien gelernt? An welcher Stelle kommst Du damit konkret nicht weiter?
Nach welcher Regel soll vor dem ersten Komma ein Leerzeichen gesetzt werden und wann nicht?
Vielen Dank für Deine Antwort :) Ich habe jetzt mal das Ergebnis in eine Datei geschrieben durch folgendes Programm:

Code: Alles auswählen

import duden

words = ["Blume", "Garten", "Sonne"]
result = []
for word in words:
    duden_word = duden.get(word)
    if duden_word is not None:
        result.append((word, duden_word.synonyms))
print(result)

with open('result.txt', 'w') as f:
    for line in result:
        f.write(f"{line}\n")
        
Das Ergebnis in der Textdatei (result.txt) sieht jetzt so aus:

Code: Alles auswählen

('Blume', ['Blumenstock, Pflanze, Topfblume, Topfpflanze'])
('Garten', ['englischer Garten, Grünanlage, grüne Lunge, Grünfläche'])
('Sonne', ['Sonnenscheibe; (gehoben) Tagesgestirn; (griechische Mythologie) Helios, Helligkeit'])
Allerdings müssten die Sonderzeichen noch weggemacht werden, damit es so aussieht:

Code: Alles auswählen

Blume, Blumenstock, Pflanze, Topfblume, Topfpflanze
Garten, englischer Garten, Grünanlage, grüne Lunge, Grünfläche
Sonne, Sonnenscheibe, (gehoben) Tagesgestirn, (griechische Mythologie) Helios, Helligkeit'
Leider weiß ich aber nicht wie man die Sonderzeichen mit Python wegmachen kann :(
Sirius3
User
Beiträge: 18276
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Repräsentation von Tuple und Listen ist nicht dafür gedacht, dass man sie weiterverarbeitet. Schreibt die Daten gleich richtig in die Datei. `line` ist ja keine Zeile, sondern ein Tuple aus Wort und Synonym-Liste. Das mußt Du also wieder in zwei Variablen speichern, und dann beide Einträge entsprechend formatiert in die Datei schreiben. Um Listeneinträge in einen Komma-Separierten String zu verwandeln, gibt es `join`.
Sind die Synonyme immer eine Liste mit genau einem Eintrag? Das wäre seltsam.
Lara99
User
Beiträge: 3
Registriert: Montag 14. November 2022, 20:43

Sirius3 hat geschrieben: Montag 14. November 2022, 22:58 Die Repräsentation von Tuple und Listen ist nicht dafür gedacht, dass man sie weiterverarbeitet. Schreibt die Daten gleich richtig in die Datei. `line` ist ja keine Zeile, sondern ein Tuple aus Wort und Synonym-Liste. Das mußt Du also wieder in zwei Variablen speichern, und dann beide Einträge entsprechend formatiert in die Datei schreiben. Um Listeneinträge in einen Komma-Separierten String zu verwandeln, gibt es `join`.
Sind die Synonyme immer eine Liste mit genau einem Eintrag? Das wäre seltsam.
Achso Dankeschön. Wie macht man das mit den 2 Variablen? Ich habe jetzt versucht die Liste in einen String umzuwandeln. Aber dadurch funktioniert leider jetzt gar nichts mehr richtig.
strng = ''
for i in result:
strng +=str(i)
print (strng)
Sirius3
User
Beiträge: 18276
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum ist `i` ein besserer Variablenname als `line`? `str` liefert genauso die Repräsentation eines Tuples, wie die Umwandlung innerhalb eines Formatstrings.
Die geläufigste Form beim Verarbeiten von Tuplen in Listen ist das Entpacken direkt im `for`:

Code: Alles auswählen

with open('result.txt', 'w', encoding="utf8") as output:
    for word, synonyms in result:
        output.write(...)
Benutzeravatar
__blackjack__
User
Beiträge: 14069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Bei `synonyms` scheint das einzige Element immer in einer Liste zu stecken, entgegen der Dokumentation des Moduls wo nur eine einzelne Zeichenkette geliefert wird. Das Modul scraped ja die Duden-Webseite. Vielleicht gab es dort ja Änderungen die noch nicht im Modul berücksichtigt wurden. Folgende Änderung an den Testfällen macht diese Vermutung wahrscheinlich: https://github.com/radomirbosak/duden/c ... 3e84764cbc
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
__blackjack__
User
Beiträge: 14069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ergänzend: Beim öffnen der Textdatei sollte man explizit eine Kodierung angeben. UTF-8 würde sich anbieten, weil man ja nicht weiss was die Webseite vom Duden da am Ende alles in den Text packt.

Und falls das eine Zeile pro Wort werden soll, würde ich auch noch mal explizit testen ob in den Daten selbst keine Zeilenendezeichen vorkommen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten