@Pedroski55: Ergänzend zu dem Beitrag von Sirius3: Kommentare sollten inhaltlich korrekt sein, denn sonst weiss man nicht ob der Kommentar oder der Code falsch ist, wenn die sich nicht einig sind. „# finde alle Buchstaben und nur Buchstaben“ stimmt beispielsweise nicht. Das findet mehr als nur Buchstaben. Das findet Zeichen die Worte oder Bestandteile von Worten sein können. Wenn man da einfach mal _alles_ anschaut worauf man den Ausdruck los lassen kann, dann findet man, dass es sich um 142.940 von 1.114.112 Zeichen handelt:
Code: Alles auswählen
#!/usr/bin/env python3
import re
import sys
import textwrap
def main():
all_word_characters = "".join(
re.findall(r"\w+", "".join(map(chr, range(sys.maxunicode + 1))))
)
print(len(all_word_characters), "von", sys.maxunicode + 1, "Zeichen:")
print(textwrap.fill(all_word_characters))
if __name__ == "__main__":
main()
Anfang der Ausgabe:
Code: Alles auswählen
142940 von 1114112 Zeichen:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzª²³µ¹º¼
½¾ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿĀāĂ㥹
ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋ
ŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſƀƁƂƃƄƅƆƇƈƉƊƋƌƍƎƏƐƑ
ƒƓƔƕƖƗƘƙƚƛƜƝƞƟƠơƢƣƤƥƦƧƨƩƪƫƬƭƮƯưƱƲƳƴƵƶƷƸƹƺƻƼƽƾƿǀǁǂǃDŽDždžLJLjljNJNjnjǍǎǏǐǑǒǓǔǕǖǗ
ǘǙǚǛǜǝǞǟǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDzdzǴǵǶǷǸǹǺǻǼǽǾǿȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏȐȑȒȓȔȕȖȗȘșȚțȜȝ
ȞȟȠȡȢȣȤȥȦȧȨȩȪȫȬȭȮȯȰȱȲȳȴȵȶȷȸȹȺȻȼȽȾȿɀɁɂɃɄɅɆɇɈɉɊɋɌɍɎɏɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣ
...
Später in der Ausgabe kommen dann noch verschiedene Ziffern und Zahlendarstellungen, unter anderem römische Zahlen, und natürlich auch Silben oder ganze Worte in aus dem Bereich von asiatischen Schriften.
Die Funktion, in der der reguläre Ausdruck dann verwendet wird, ist ziemlich umständlich ausgedrückt, dafür dass das nur ein anderer Name für die konkrete `findall()`-Methode ist:
Code: Alles auswählen
def worte_holen(text):
res = WORD_RE.findall(text)
return res
# =>
worte_holen = WORD_RE.findall
Das Argument von `hole_zeilen()` ist ein Dateiname, den sollte man deshalb nicht `text` nennen.
Beim öffnen von Textdateien sollte man immer explizit die Kodierung angeben.
``yield`` in einer simplen Schleife ist eigentlich keine Schleife, sondern ``yield from``.
Entweder `worte` oder `woerter`, aber bitte nicht `worter`. Noch übler ist `linie_list`. Denglisch, Grunddatentyp im Namen, und der deutschsprachige Teil ist inhaltlich falsch. Das ist keine Linie sondern eine Zeile. Oder passender, das sind Worte. Letztlich braucht man aber auch gar keinen Namen dafür wenn man nicht jedes kleine Zwischenergebnis an einen Namen bindet.
Um ein Wörterbuch mit Schlüsseln, die alle den selben Wert haben, zu erzeugen, haben Wörterbücher die `fromkeys()`-Methode:
Code: Alles auswählen
wortanzahl = {wort: 0 for wort in worte}
# =>
wortanzahl = dict.fromkeys(worte, 0)
Statt jedes Wort gegen die Liste zu prüfen, wäre es effizienter gegen die Schlüssel des Wörterbuchs zu prüfen.
Zwischenstand (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
import re
from collections import Counter
def zeilen_holen(dateiname):
with open(dateiname, encoding="utf-8") as zeilen:
yield from zeilen
worte_holen = re.compile(r"\w+").findall
def main():
wortanzahl = Counter(
(substantiv, 0)
for substantiv in ["Jahr", "Frühling", "Sommer", "Herbst", "Winter"]
)
for zeile in zeilen_holen("/home/peterr/temp/Deutschetexte/Dtext1.txt"):
print(zeile)
wortanzahl.update(
wort for wort in worte_holen(zeile) if wort in wortanzahl
)
if __name__ == "__main__":
main()