Problem Filenotfound

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
kl.as
User
Beiträge: 8
Registriert: Mittwoch 14. März 2018, 12:24

Donnerstag 15. März 2018, 15:55

Hallo,
Mein Problem: Meine Liste folder enthält mehrere Textdateien, dieser Teil des Codes ist unten nicht zu sehen. Die Funktion read_folder bekommt den Namen einer Datei übergeben, liest die Datei ein, und gibt eine verschachtelte Liste zurück. Jedes Element der zurückgegebenen Liste stellt eine Zeile aus der Textdatei als Liste aus Wörtern dar.
Mein Code:

Code: Alles auswählen

def read_folder(name):
    """
    """
    file = open("name", "r", encoding="utf-8")
    result =[]
    for line in file:
        line = file.readline()
        word = line.split()
        result.append(word)
    return result
dann will ich die Funktion aufrufen mit read_folder("nameeinertextdatei")

mir wird dann immer angezeigt:
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-216-db68ac83f7df> in <module>()
----> 1 read_folder("nameeinertextdatei")

<ipython-input-215-56bf5967901e> in read_folder(name)
2 """
3 """
----> 4 file = open("name", "r", encoding="utf-8")
5 result =[]
6 for line in file:

FileNotFoundError: [Errno 2] No such file or directory: 'name'
Benutzeravatar
noisefloor
User
Beiträge: 2397
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Donnerstag 15. März 2018, 16:07

Hallo,

dein Skript sucht auch nach einer Datei, die den Namen "name" hat - das ist der Dateiname, den du als String an `open` übergibst. Mach' mal die Anführungsstriche um name weg, dann wird die Variable `name` verwendet.

Zum Code:
a) du schließt die Datei nicht - das kann zu Probleme führen
b) öffnest du Dateien so wie so besser mit dem `with` Statement, weil Python sich dann darum kümmert, dass die Datei auch wieder geschlossen wird.

Gruß, noisefloor
kl.as
User
Beiträge: 8
Registriert: Mittwoch 14. März 2018, 12:24

Donnerstag 15. März 2018, 17:08

mein Problem hat sich jetzt geändert. Ich kann die Datei öffnen allerdings wird nur ein Teil ausgegeben statt dem ganzen Text :K
Benutzeravatar
/me
User
Beiträge: 3191
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Donnerstag 15. März 2018, 17:21

kl.as hat geschrieben:

Code: Alles auswählen

def read_folder(name):
    file = open("name", "r", encoding="utf-8")
    result =[]
    for line in file:
        line = file.readline()
        word = line.split()
        result.append(word)
    return result
Dein Problem ist das readline. Mit "for line in file :" liest du schon jede einzelne Zeile. Das folgende "readline" sorgt dann dafür, dass direkt die nächste Zeile gelesen wird. Du überspringst also in jedem Durchlauf eine Zeile.

So würde es funktionieren.

Code: Alles auswählen

def read_folder(name):
    data = open(name, "r", encoding="utf-8")
    result =[]
    for line in data:
        word = line.split()
        result.append(word)
    data.close()    
    return result
Dann kannst du noch das with-Statement einsetzen um die Datei automatisch zu schließen.

Code: Alles auswählen

def read_folder(name):
    with open(name, "r", encoding="utf-8") as data:
        result =[]
        for line in data:
            word = line.split()
            result.append(word)
    return result
Jetzt kann man die Schleife noch durch eine list comprehension ersetzen.

Code: Alles auswählen

def read_folder(name):
    with open(name, "r", encoding="utf-8") as data:
        result = [line.split() for line in data]
    return result
Zum Schluss kann man noch das Binden an den Namen result sparen und bekommt:

Code: Alles auswählen

def read_folder(name):
    with open(name, "r", encoding="utf-8") as data:
        return [line.split() for line in data]
Disclaimer: Alles ungetestet.
kl.as
User
Beiträge: 8
Registriert: Mittwoch 14. März 2018, 12:24

Donnerstag 15. März 2018, 17:31

Super! Mit der Erklärung habe ich es auch gleich verstanden und so funktioniert jetzt alles :D

Danke für die Mühe :D
Benutzeravatar
/me
User
Beiträge: 3191
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Donnerstag 15. März 2018, 17:49

kl.as hat geschrieben:Super! Mit der Erklärung habe ich es auch gleich verstanden und so funktioniert jetzt alles :D
Falls die list comprehension vielleicht noch etwas viel war, hier noch eine kleine Erläuterung.

Nehmen wir an, du möchtest die Quadratzahlen von 0 bis 9 in eine Liste packen. Der klassische Code mit einer for-Schleife sähe dann wie folgt aus:

Code: Alles auswählen

data = []
for i in range(10):
    data.append(i ** 2)
Zuerst wird eine leere Liste definiert und anschließend in einer Schleife mit Daten gefüllt.

In einer list comprehension würde das wie folgt aussehen:

Code: Alles auswählen

data = [i ** 2 for i in range(10)]
Damit hat man alles auf einmal und wenn man die Syntax erstmal verinnerlicht hat, dann ist es (zumindest für mich) auch noch leichter zu lesen. Performanter ist es typischerweise auch, aber wenn man High-Performance haben möchte, dann würde man ohnehin nicht reines Python dafür einsetzen.
Antworten