
ich habe vor kurzem begonnen mir Python beizubringen. Ich habe im Laufe der letzten Jahre schon verschiedenen Programmiersprachen (kennen)gelernt (eigentlich hauptsächlich die Basics), also bin ich kein kompletter Neueinsteiger. Jedoch ist das letzte (kleine) Programm was ich geschrieben mindestens ein Jahr her.
Also habe ich mich mal hingesetzt und zur Übung ein bisschen was gebastelt.
Ich freue mich über Kritik und Verbesserungsvorschläge, vorallem geht es mir darum ob der Code "sauber" geschrieben ist, oder wenn nicht, in welchen Punkten es elegantere Lösungen gibt.
P.S. Um einer Anmerkung zuvor zu kommen, ich habe teilweise "überflüssige" while True Schleifen eingebaut um den Code im PyCharm Editor einklappen zu können (geht das auch anders ?)
Viele Grüße
Code: Alles auswählen
# -*- coding: UTF-8 -*-
# Name: Textalyzer
# Autor: codecode123
# Version: 1.0 03.04.2018
# Beschreibung: Textanalysewerkzeug, überprüft einen Text nach der Häufigkeit aller vorkommender Buchstaben (in Arbeit) und Wörter
# und gibt eine umfangreiche Statistik aus.
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Todo
# ...
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# BUGS:
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Überprüft ob ein Text "text" nur gültige Zeichen (Standard: Alphabet, wahlweise 0-9 und 'Leerzeichen') enthält
def enthaelt_sonderzeichen(text, leerzeichenok=False, zahlen_ok=False):
gueltig = "abcdefghijklmnopqrstuvwxyzßäöüABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ"
if leerzeichenok is True:
gueltig += " "
if zahlen_ok is True:
gueltig += "0123456789"
if all(c in gueltig for c in text):
return False
else:
return True
# Entfernt Sonderzeichen vom Textanfang /-ende
def entferne_sonderzeichen(text):
while True:
if len(text) == 1:
break
# Sonderzeichen am ENDE
if enthaelt_sonderzeichen(text[len(text) - 1]) is True:
text = text[:(len(text) - 1)]
# Sonderzeichen am ANFANG
elif enthaelt_sonderzeichen(text[0]) is True:
text = text[1:]
else:
break
return text
# Sortiert ein Dictonarie nach den Value Werten!
def dictsort(dict_in, reverse_=True):
sort = []
for v in dict_in:
sort.append([dict_in[v], v])
sort.sort(key=None, reverse=reverse_)
return sort
# Ähnlich input(), zusätzlich optionale Gültigkeitsüberprüfung mit optionaler manueller Fehlermeldung
def iinput(mystr="?:", gueltig=(), err="Ungültige Eingabe!"):
if gueltig == ():
return input(mystr)
else:
while True:
tmp = input(mystr)
if tmp in gueltig:
break
else:
print(err, )
return tmp
# Variablen festlegen
while True:
Pos = 0
Dict = {}
WortFilter = [""]
Zaehler = 0
Wortliste = []
break
# I: Abfrage: Texteingabe oder Text aus Datei einlesen.
TextEingabe = iinput("Text eingeben (1) oder Text aus Datei einlesen (2)? ", ("1", "2"))
# II: Auswertung: Texteingabe oder Text aus Datei einlesen.
while True:
# (2) String aus Datei einlesen
if int(TextEingabe) == 2:
DateiPfad = input("Dateinamen bzw. Pfad eingeben: ")
try:
File = open(DateiPfad, "r")
Text = File.read()
File.close()
break
except FileNotFoundError:
print("Datei nicht gefunden!")
# (1) String manuell eingeben
else:
Text = input("Bitte zu analysierenden Text eingeben: ")
# Mindestlänge 2 Zeichen
if len(Text) < 2:
print("Text zu kurz!")
else:
break
# III: Wortliste generieren
while Pos < len(Text):
# Suche nach Leerzeichen
Fund = Text.find(" ", Pos)
# Kein Leerzeichen-Fund =>
if Fund == -1:
# Kein (weiterer) Fund, markiere letztes Wort
Wortliste.append(Text[Pos:])
Fund = len(Text) - 1
# Leerzeichen-Fund =>
else:
Wortliste.append(Text[Pos:Fund])
# Position verschieben UND Zaehler hochsetzen
Pos = Fund + 1
Zaehler += 1
# IV: Wortliste modizizieren und filtern (map & filter)
while True:
# Alle Wörter kürzer als 2 Zeichen entfernen
Wortliste = list(filter(lambda x: len(x) > 1, Wortliste))
# Alle Sonderzeichen vom Wortanfang / -ende entfernen
Wortliste = list(map(entferne_sonderzeichen, Wortliste))
# Alle Wörter mit innenliegenden Sonderzeichen entfernen
Wortliste = list(filter(lambda x: enthaelt_sonderzeichen(x) is False, Wortliste))
# Alle Wörter klein schreiben
Wortliste = list(map(lambda x: x.lower(), Wortliste))
# Wörter aus dem Wortfilter entfernen
Wortliste = list(filter(lambda x: x not in WortFilter, Wortliste))
break
# V: Wörter aus Wortliste in Dictonarie überführen und zählen
while not Wortliste == []:
Wort = Wortliste.pop()
if Wort in Dict:
# Counter hochsetzen
Dict[Wort] += 1
else:
# Neues Wort! Counter 1...
Dict[Wort] = 1
# VI: Ausgabe
while True:
# Wörter sortiert nach Häufigkeit ausgeben und Prozentualer Anteil am Zaehler
for i in dictsort(Dict):
Leerstellen = (20 - len(i[1])) * " "
Leerstellen_2 = int((4 - len(str(i[0])))) * " "
print(i[1], Leerstellen, i[0], Leerstellen_2, round((i[0] / Zaehler) * 100, 1), "%")
print("Anzahl verschiedener Wörter im Text: ", len(Dict))
print("Anzahl aller Wörter im Text: ", Zaehler)
print("\nHinweis: Die Anzahl der Wörter betrifft nur solche die als gültig erkannt wurden.")
print("\nWörter welche Sonderzeichen oder Zahlen enthalten werden nicht ausgewertet!")
break