Statistik aus .txt datei

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
overClock2009
User
Beiträge: 2
Registriert: Sonntag 21. April 2013, 18:58

Hallo,

hab eine HA bekommen uns zwar das wir ein Statistik Programm erstellen sollen sowei alles okay, hab das auch hin bekommen. Mein Problem liegt darin das mit "Funktionen" zu gestallten.

Ich würde mich freuen wenn Ihr mir helfen würdet.

Code: Alles auswählen

import codecs
import string

# Hier werden die Buchstaben deffiniert.
chars= string.ascii_letters


print "Statistik eines .txt- Dokuments"
print "_______________________________"
print "Hinweis: alle Dateinamen immer mit .txt-Endung eingeben!!!" + "\n"

# Hier wird den Benutzer gefragt welche Datei geöffnet werden soll.
datei = raw_input("Geben sie ein Dateinamen ein den Sie oeffnen wollen: ")
# Hier wird ein Wort abgefragt das später der Dateiname von der Statistik ausgabe wird.
anlegen = raw_input("Geben Sie ein Dateinamen an fuer die Ausgabe der Statistik: ")
print ""
# Hier wird dann die Datei geöffnet die vom Nutzer angefordert worden ist.
file = open(datei, "r")
# Hier wird dann die Datei eingelesen
lines = file.readlines()

# Parameter für Normalezeichen
normal = 0
# Parameter für Leerzeichen
space = 0
# Parameter für andere Zeichen
other = 0
# Parameter für Sätze
saetze = 0
# Parameter für Absätze
absaetze = 0


# Eine for-Schleife.
for l in lines:
    for c in l:
        # Für die Buchstaben zeichen.
        if c in chars:
            normal += 1
        # Für die Leerzeichen.
        elif c in " \n\r\t":
            space += 1
        # Für andere Zeichen z.b. "!,?" etc.
        else:
            other += 1
        # Für die Saetze.
        if c in ".":
            saetze += 1
        # Für die Absaetze.
        if c in "\r\n":
            absaetze += 1

# Ausgabe der Statistik in der Konsole.
print "Hier ist die Statistik fuer den Text " + datei + "\n"+ "\n"
print "Anzahl aller Buchstaben  : ", normal
print "Anzahl aller Zeichen     : ", normal + space + other
print "Anzahl aller Woerter     : ", space +1
print "Anzahl aller Saetze      : ", saetze
print "Anzahl aller Absaetze    : ", absaetze

# Ausgabe der Statistik in einer Datei.
schreiben = open( anlegen, "w")
schreiben.write("Hier ist die Statistik für den Text " + datei + "\n"+ "\n")
schreiben.write("Anzahl aller Buchstaben : " + str(normal) + "\n")
schreiben.write("Anzahl aller Zeichen    : " + str(normal+space+other )+"\n")
schreiben.write("Anzahl aller Woerter    : " + str(space+1)+"\n")
schreiben.write("Anzahl aller Saetze     : " + str(saetze)+"\n")
schreiben.write("Anzahl aller Absaetze   : " + str(absaetze)+"\n")
overClock2009
User
Beiträge: 2
Registriert: Sonntag 21. April 2013, 18:58

ich würde mich wirklich um eine schnelle hilfe freuen, da ich das Programm morgen abgeben muss.

Vielen Dank nochmal
BlackJack

@overClock2009: Wo liegt denn das Problem? Was hast Du an der Erklärung von Funktionen im Tutorial in der Python-Dokumentation nicht verstanden? Was hast Du denn geschrieben was dann wie nicht funktioniert hat?

Der `codecs`-Import wird nicht verwendet — der kann also raus.

Die ganzen Kommentare sind überflüssig, denn sie „erklären” jeweils das offensichtliche was da im Quelltext noch mal steht. Kommentare sollten einen Mehrwert zum Quelltext bieten und nicht einfach nur Redundanz. In einen Kommentar gehört *warum* etwas so gemacht wird, wie es im Quelltext gemacht wird. Denn *was* gemacht wird, steht ja schon als Quelltext dort.

Namen sollten erklären was die Bedeutung des Wertes dahinter im Programm ist. `datei` wird nicht an ein Dateiobjekt gebunden, sondern an einen Datei*namen*. `anlegen` wäre ein Name für eine Funktion (oder Methode), denn die werden per Konvention nach Tätigkeiten benannt, weil sie genau dafür stehen: Da wird etwas getan. Für eine Zeichenkette ist der Name ungeeignet. Ebenso der Name `schreiben` für ein Dateiobjekt. Einbuchstabige Namen die nicht auf einen Ausdruck beschränkt sind, sollte man auch vermeiden. Quelltext wird einmal geschrieben und mehrmals gelesen — da sollte man auf möglichst sprechende Bezeichner achten, damit man sich nicht mit Raten aufhalten muss.

Dateien die man öffnet sollte man auch wieder schliessen. Sehr praktisch in dem Zusammenhang ist die ``with``-Anweisung.

Die `readlines()`-Methode auf Dateiobjekten braucht man eigentlich nicht. Entweder man iteriert direkt über die offene Datei — dann liefert die nämlich die einzelnen Zeilen — oder man ruft `list()` mit dem Dateiobjekt auf, dann bekommt man auch eine Liste mit den Zeilen. Bevorzugen sollte man das iterieren über das Dateiobjekt, weil dann nicht die ganze Datei in den Arbeitsspeicher geladen wird.

Die Zähler sind keine Parameter. Der Begriff wird in den Kommentaren falsch verwendet.

Zeichenketten haben für einige von den „Zeichenklassen” die Du zählen willst Testmethoden. Und die Anzahl der Absätze solltest Du mal überprüfen. Da zählt das Programm nämlich etwas anderes. Je nach dem wie man Absätze definiert, ist das auch gar nicht so einfach zu zählen — da braucht man etwas mehr Programmlogik als für die anderen Sachen die gezählt werden sollen.

Die Ausgabe ist ein perfekter Kandidat für eine Funktion. Denn da wird im Grunde zweimal exakt das gleiche gemacht; einmal werden die Daten auf die Standardausgabe geschrieben und einmal in eine Datei auf dem Hintergrundspeicher. Beides geht mit einer Funktion, denn die Standardausgabe steht im `sys`-Modul unter dem Namen `stdout` als Dateiobjekt zur Verfügung. Widerholungen in Quelltext und Daten ist etwas was man als Programmierer nach Kräften vermeiden sollte.
Antworten