Analyze a text file

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
C&MUP
User
Beiträge: 2
Registriert: Dienstag 25. Juni 2019, 18:11

Hallo,

wir haben folgende Frage gestellt bekommen:

1.1 Write a function which returns a list
Write a function called analyze file list() which takes a file path as an argument and returns a list. The structure of the list should be as follows: [(name of the file as string), (number of words in the file), (number of lines in the file)]

Leider tut unser Code nicht was er soll!
Wer kann helfen?
Liebe Grüße
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na dann zeigt mal euren Code. Hausaufgaben erledigen wird hier nicht gemacht. Hilfe zur Selbsthilfe aber gern.
C&MUP
User
Beiträge: 2
Registriert: Dienstag 25. Juni 2019, 18:11

def analyze_file_list (tiger):
f = open("tiger.txt", "r")
print(f.read)
lines = f.readlines
for word in lines:
words= line.split()
print(words)
print(analyze_file_list)


Unser Textkorpus den wir benutzen heißt "tiger.txt", deswegen steht das in f. Und das Hauptproblem ist es, dass unser Programm (Pycharm) nicht die Textdatei öffnet, obwohl sie in allen Ordern drin ist, die auch nur irgendwas mit dem Programm (Pycharm) zu tun haben.


Es wäre super, wenn ihr uns da weiterhelfen könntet.:)
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte in Zukunft die code Tags benutzen, damit Code lesbar ist.

Ihr habt (und das ist ja auch explizit gefordert) ein Funktionsargument. Aber ihr benutzt es nicht. Ihr ruft weder read noch readlines auf. Da fehlen die Klammern. Wenn ihr die ergänzt, geht das Programm immer noch nicht, dann dann konsumiert read schon alles was in der Datei ist. Du kannst auch nicht erst den Kühlschrank ausleeren, und danach Eiscreme darin suchen. Last but not least: Funktionen muss man auch aufrufen. Den Aufruf sehe ich im Code nicht.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nachtrag: wegen der fehlenden Code Tags habe ich das nicht gesehen. Ich vermute mal die letzte Zeile soll der Aufruf sein. Auch da fehlen die Klammern. Und es fehlt das geforderte Argument.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

for word in lines:
    words = line.split()
Der Ansatz ist schon vielversprechend. Aber ihr wollt ja nicht die Wörter haben, sondern die Anzahl der Wörter zählen. Möglicherweise hat Python ja etwas eingebaut, das Elemente zählen kann. Wer weiß, wer weiß...

Außerdem macht es wenig Sinn, wenn words (oder eben später die Anzahl) ständig überschrieben wird. Dann hat man ja nur das Ergebnis der letzten Zeile. Hier muss der Schleifendurchlauf sozusagen mit der Außenwelt interagieren. Das heißt: Ein Zähler sollte vor der Schleife eingebaut werden, der dann für jede Zeile um die entsprechende Wortzahl erhöht wird.

Letztlich ist das in Python ein Einzeiler, sofern man die passende Builtin-Funktion und gewisse Techniken kennt. Für euch als Anfänger ist es aber besser wenn ihr erstmal auf die "lange" Lösung kommt.
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@C&MUP: Grunddatentypen sollten in Namen in aller Regel nicht vorkommen. In `analyze_file_list()` ist das sogar massiv irreführend weil das ja „analysiere Dateiliste“ heisst, nur das da gar keine Dateiliste analysiert wird, sondern eine Datei.

`tiger` ist ein schlechter Name, da kein Mensch anhand dieses Namens erraten kann, dass der für einen Dateinamen bzw. Pfad zu einer Datei steht. So etwas nennt man üblicherweise `filename` oder `file_path`.

Der Rückgabetyp sollte keine Liste sein. Listen sind für gleichartige Objekte, bei denen es Sinn macht die gleich zu behandeln. Wenn die Position in der Sequenz darüber entscheidet, was der Wert *bedeutet*, dann ist das ein Fall für ein Tupel. Wenn es zu viele Werte werden und IMHO sind wir hier schon hart an der Grenze, sollte man einen eigenen Tupeltyp mit `collections.namedtuple()` erstellen und den Elementen zusätzlich auch einen Namen geben. Das macht die Programmentwicklung und die Fehlersuche einfacher. Und die Ausgabe des Programms, wenn man so einen Wert in eine Zeichenkette umwandelt, verständlicher.

`print()` gehört in die Funktion nicht rein. Die soll nur etwas tun und ein Ergebnis an den Aufrufer liefern, aber nicht mit dem Benutzer interagieren.

Dateien die man öffnet, muss man auch wieder schliessen. Am besten verwendet man in Python dafür die ``with``-Anweisung. Ansonsten braucht man ``try``/``finally`` um das sicher und sauber zu lösen.

Das ganze mal in der Programmiersprache Tcl um eine Möglichkeit der Strukturierung einer Lösung zu zeigen.

Code: Alles auswählen

#!/bin/sh
# \
exec tclsh "$0" "$@"

proc analyze_text {filename} {
    set f [open $filename]
    try {
        set line_count 0
        set word_count 0
        while {[gets $f line] >= 0} {
            incr line_count
            incr word_count [llength [split $line]]
        }
        return [list $filename $word_count $line_count]
    } finally {
        close $f
    }
}

puts [analyze_text "tale.txt"]
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten