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
Analyze a text file
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.
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.
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.
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.
Code: Alles auswählen
for word in lines:
words = line.split()
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.
- __blackjack__
- User
- Beiträge: 13111
- 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.
`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