Einfache Wortliste aus beliebiger .txt

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
Prexomat
User
Beiträge: 3
Registriert: Samstag 11. April 2020, 14:22

Hey zusammen,

ich bin ziemlicher Python-Anfänger, also sorry schon mal, wenn ich hier Fachtermini nicht korrekt ausdrücke :?

Was ich erreichen will: Eine Liste aus Wörtern die aus einer beliebigen .txt erstellt wird.
Die .txt ist dabei ein beliebiger Text mit Satzzeichen, Klammern etc.

Hier bin ich aktuell:

Code: Alles auswählen

raw_list = list()
test = 'test.txt'
file = open(test, encoding="utf8")
# badchars = '().;,'

with file as words:
    for word in words:
        if word not in raw_list:
            raw_list.append(word.strip())

print (raw_list)

newfile = 'dic.txt'
with open(newfile, 'w') as fout:
    for words in raw_list:
        fout.write(words + '\n')
Wo ich jetzt nicht weiterkomme:
  • Alle Zeichen beim "importieren" ignorieren, sodass nur die Wörter der .txt ausgewählt werden, und keine Zeichen wie Kommas, Klammern etc. (siehe badchars).
  • Alle Wörter die mit einem Kleinbuchstaben beginnen ignorieren
Ich habe schon einige Ansätze probiert, aber leider mit keinem zufriedenstellenden Ergebnis.

Ich freue mich über jede Hilfe bzw. jeden Tipp. Danke!
Prexomat
User
Beiträge: 3
Registriert: Samstag 11. April 2020, 14:22

Ok ich habe jetzt nach langem Suchen erstmal selber eine Lösung gefunden :D:
Falls jemand allerdings eine elegantere Lösung kennt, bin ich froh für Tipps.

Code: Alles auswählen

raw_list = list()
test = 'test.txt'
file = open(test, encoding="utf8")

with file as words:
    for word in words:
        if word not in raw_list:
            raw_list.append(word.strip())

listToStr = ' '.join([str(elem) for elem in raw_list])

raw_list2 = listToStr.translate({ord(i):(' ') for i in '!@#$().;,'})

raw_list3 = [word for word in raw_list2.split() if word[0].isupper()]
raw_list3 = list(set(raw_list3))

raw_list3.sort()
print (raw_list3)

newfile = 'dic.txt'
with open(newfile, 'w') as fout:
    for words in raw_list3:
        fout.write(words + '\n')
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Statt der Variable `file` wird normalerweise das `open` direkt in `with` geschrieben. `raw_list` enthält „Wörter” ohne Zeileendezeichen, Du prüfst aber, ob `word` mit Zeileendezeichen in `raw_list` ist. Das kann nie der Fall sein. Statt dessen benutzt man normalerweise auch einfach ein Set:

Code: Alles auswählen

with open('test.txt', encoding="utf8") as words:
    raw_words = set(w.strip() for w in words)
`listToStr` ist falsch geschrieben, weil Variablen immer komplett_klein geschrieben werden. raw_list enthält schon Strings, so dass der Aufruf von str unnötig ist, auch bräuchte man keine Liste erstellen, sondern könnte join mit einem Generator füttern.

Code: Alles auswählen

raw_words = ' '.join(raw_words)
Man braucht auch nicht immer wieder einen neuen Variablennamen zu benutzen, vor allem, wenn die Namen sich nur durch eine Nummer unterscheiden.
Dann ist es ziemlich umständlich, erst eine Datei zeilenweise zu lesen, um sie wieder in einen String zu packen um dann Zeichen zu ersetzen, das ganze wieder zu splitten und diese Liste in ein Set zu verwandeln, das dann wieder zu einer Liste wird.
Beim Schreiben fehlt das Encoding. `words` in der for-Schleife ist immer nur ein Wort.

Code: Alles auswählen

TRANSLATION = {ord(c):' ' for c in '!@#$().;,'}

with open('test.txt', encoding="utf8") as words:
    words = set(words.read().translate(TRANSLATION).split())
words.sort()
with open('dic.txt', 'w', encoding="utf8") as output:
    for word in words:
        output.write(f"{words}\n")
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`set` hat keine `sort()`-Methode. Ausserdem wird `words` zweimal für sehr unterschiedliche Dinge verwendet.

Code: Alles auswählen

from pathlib import Path

TRANSLATION = {ord(c): " " for c in "!@#$().;,"}


words = sorted(
    set(
        Path("test.txt")
        .read_text(encoding="utf-8")
        .translate(TRANSLATION)
        .split()
    )
)

with open("dic.txt", "w", encoding="utf8") as output:
    output.writelines(f"{word}\n" for word in words)
Wobei ich den Ansatz eine feste Liste von Zeichen zu verbieten bei der Vorgabe „beliebige Textdatei“ eher nicht wählen würde, denn da fehlt dann ja alles Mögliche was in beliebigen Textdateien so vorkommen kann. Fragezeichen, Bindestriche in verschiedenen Ausprägungen, „bullet points“ in verschiedenen Ausprägungen, vielleich auch mal ein Schrägstrich, Auslassungspunkte, Typografische Anführungsstriche in verschiedenen Ausprägungen, …
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Prexomat
User
Beiträge: 3
Registriert: Samstag 11. April 2020, 14:22

Danke, hat geklappt! Und danke für die Tipps :).
Antworten