Seite 1 von 1
Lesen Information von einer Datei
Verfasst: Mittwoch 1. Dezember 2021, 20:47
von Lini
Hallo,
ich arbeite das Thema Schreiben und Lesen von Informationen in eine Datei (Python).
Zuerst mit Hilfe der Methode read():
Code: Alles auswählen
# Erstellen Sie eine Textdatei filename1.txt mit Ihrem Lieblingslied (manuell, via ?Explorer?) und
# versuchen Sie, den Inhalt vollständig und Zeile für Zeile mit den Methoden auszugeben:
# read() readline() readlines() for
myFile1 = open('my_hope.txt')
print(myFile1.read())
Ich habe eine Textdatei „my_hope.txt“ erstellt und wollte, damit das Programm Zeilen / Text zurückgibt.
Was mir nicht ganz klar ist:: wovon kennt Python: wo (Pfad, Ordner) ich die Datei 'my_hope.txt' gespreichert habe?: um die Texte von dort aus lesen zu können? Hier habe ich es hier gespeichert: C \ ……… \ AppData \ Local \ Programs \ Python \ Python38 \ exersices
Muss ich den Pfad in einer Form dem Python-Programm mitteilen? Wenn ja : dann wie?
Wenn ich den RUN-Befehl ausführe, erhalte ich eine Fehlermeldung.

Re: Lesen Information von einer Datei
Verfasst: Mittwoch 1. Dezember 2021, 20:54
von P_Python
Wenn du nur den Dateinamen beim Open angibst, dann muss die Datei im gleichen Ordner sein, wie dein Python Programm.
Wenn die Datei in einem anderen Ordner liegt, dann musst du einen Pfad angeben. Dazu gibt es 2 Möglichkeiten
1) relative Pfadangabe: ausgehend von deinem Programmordner gibst du einen Pfad an
2) absolute Pfadangabe: du gibst den kompletten Pfad an ausgehend vom Laufwerksbuchstaben(bei dir C:)
Re: Lesen Information von einer Datei
Verfasst: Mittwoch 1. Dezember 2021, 21:08
von __deets__
P_Python hat geschrieben: Mittwoch 1. Dezember 2021, 20:54
Wenn du nur den Dateinamen beim Open angibst, dann muss die Datei im gleichen Ordner sein, wie dein Python Programm.
Das ist falsch. Und immer wieder Quell von Problemen hier.
Ein relativer Pfad wird aufgelöst über das Arbeitsverzeichnis. Wohin das zeigt ist grundsätzlich beliebig. Wenn du ein Skript aus der Shell aufrufst, dann ist das Verzeichnis in dem die Shell steht das Arbeitsverzeichnis. Wenn du dein Skript also zb mit
python mein/skript.py
aufrufst, kracht es, wenn man deinem Rat folgt.
Ein beliebter Trick besteht darin, den relativen Pfad via der Variablen __file__, die auf den Pfad des Skripts zeigt, aufzulösen.
pathlib.Path(__file__).resolve().parent / „relativ.dat“
ZB
Re: Lesen Information von einer Datei
Verfasst: Mittwoch 1. Dezember 2021, 21:40
von P_Python
Also bei Windows, hier wird ja Windows benutzt, funktioniert das im CMD so, wenn man mit cd in das Python Verzeichnis verzweigt und dann mit python mein_programm.py das Programm startet.
Re: Lesen Information von einer Datei
Verfasst: Mittwoch 1. Dezember 2021, 21:44
von Sirius3
@P_Python: ja, so kann man das machen, muß es aber nicht, wie __deets__ ja schon gezeigt hat.Du gehst also von einem Spezialfall aus und verallgemeinerst fälschlicherweise.
Re: Lesen Information von einer Datei
Verfasst: Mittwoch 1. Dezember 2021, 21:45
von __deets__
Ja. Das habe ich ja auch gesagt. Der Punkt ist, es kommt darauf an. Nicht, wie du behauptest, wo die Datei relativ zum Skript liegt. Du kannst auch mit
python c://voller/pfad/Skript.py
dein Skript starten. Und dann klappt’s eben nicht mehr.
Re: Lesen Information von einer Datei
Verfasst: Mittwoch 1. Dezember 2021, 22:11
von P_Python
Meint ihr im Ernst, eure Antworten sind zielführend für den Fragesteller?
Man sieht doch, dass das eine Frage von einem Anfänger ist und er eine einfache Antwort benötigt.
Auch wenn ihr irgendwelche Ausnahmen und Spezielfälle ausgräbt und damit auch recht habt, was ich nicht bestreite, so überfrachtet ihr doch einen Anfänger mit euren Antworten.
Bei Anfänger kann man doch einfache Antworten geben, bei Fortgeschrittene tiefergreifende, das geht doch meistens schon aus dem post hervor wie der Kenntnisstand ist, oder?
Re: Lesen Information von einer Datei
Verfasst: Mittwoch 1. Dezember 2021, 22:17
von __deets__
Wenn du deine mehreren hundert Fragen, die sich aus diesem Missverständnis hier schon ergeben haben, beantwortet hast, dann änderst du da ggf deine Meinung.
Und einfach falsch ist nicht einfach. Es ist auch kein ausgegrabener Spezialfall. Schon das öffnen via IDE oder der gescheiterte Versuch, es als Cronjob zu starten, reichen da aus.
Re: Lesen Information von einer Datei
Verfasst: Mittwoch 1. Dezember 2021, 22:21
von darktrym
Wenn das Programm im Suchpfad ist stimmt die Annahme natürlich auch nicht.
Re: Lesen Information von einer Datei
Verfasst: Mittwoch 1. Dezember 2021, 22:32
von P_Python
Und ihr meint jetzt, der Fragesteller kann was mit Cronjob oder Suchpfad anstellen??
Bleibt doch mal auf dem Teppich und versetzt euch in einen Anfänger. Ziel ist doch, dass ein Anfänger auch was versteht, oder?
Wenn dann jemand schreibt, dass die Datei im Python Verzeichnis liegt und sie nicht gefunden wird, könnt ihr ja euer Wissen auspacken.
Re: Lesen Information von einer Datei
Verfasst: Mittwoch 1. Dezember 2021, 22:41
von sparrow
@P_Python: Jeder hier versetzt sich gerade in die Lage eines Anfängers und erklärt wie sich der Fall verhält. Ich finde es beachtlich, mit welcher Beharrlichkeit du deine falsche Aussge verteidigst. Freu dich doch lieber, dass __deets__ dem Themenstarter und dir das korrekte Wissen aufgezeigt hat - inklusvie der Lösung, wie man das Problem dauerhaft in Zukunft vermeidet.
Re: Lesen Information von einer Datei
Verfasst: Mittwoch 1. Dezember 2021, 23:01
von P_Python
@sparrow
Du schweifst wieder ab, du sollst dich in den Fragesteller versetzen und ich glaube nicht, dass der Fragesteller irgendwas von euren Antworten verstanden hat. Aber da rede ich wohl an eine Wand.
Re: Lesen Information von einer Datei
Verfasst: Mittwoch 1. Dezember 2021, 23:08
von Lini
Ein zwischenDank an euch alle. Ja, eine einfache Antwort ist erwartet, aber die Einfachkeit ist bei jedem anders...
Die text-Datei 'my_hope.txt' liegt im gleichen Ordner mit der Python-Datei 'Ausgabe von File mit Methoden read_readine_readlines_for.py'
Trotzdem habe ich den Pfad zur ~Sicherheit angegeben.
Aktualisierung meiner Frage:
Code: Alles auswählen
# Erstellen Sie eine Textdatei filename1.txt mit Ihrem Lieblingslied (manuell, via ?Explorer?) und
# versuchen Sie, den Inhalt vollständig und Zeile für Zeile mit den Methoden auszugeben:
# read() readline() readlines() for
myFile1 = open('C:\Users\Onri\AppData\Local\Programs\Python\Python38\exersices\my_hope.txt', 'rt', encoding="utf8")
print(myFile1.read())
Das führt auch zur Fehlermeldung, jedoch es scheint andere Fehlermeldung zu sein
Könntet ihr das eingefügte Bild sehen?
Re: Lesen Information von einer Datei
Verfasst: Mittwoch 1. Dezember 2021, 23:20
von __deets__
Du musst den Pfad mit / statt \ angeben, weil letzterer escape Sequenzen einleitet. Oder ein raw String literal benutzen. Mit r"C:\..".
Re: Lesen Information von einer Datei
Verfasst: Mittwoch 1. Dezember 2021, 23:21
von Sirius3
Fehlermeldungen postet man am besten als Text und nicht als Bild.
\ ist das Escapezeichen und \U erwartet eben 8 Hexadezimale Ziffern um damit ein Unicodezeichen einzugeben, s ist aber keine Ziffer. Pfade trennt man am besten immer mit /, dann hat man auch keine Probleme.
Das my bei myFile1 ist ein nichtssagender Präfix, den man weglassen sollte, die 1 hilft auch nicht für das Verständnis. Dateien, die man öffnet, muß man auch wieder schließen, am besten, indem man with benutzt:
Code: Alles auswählen
with open('C:/Users/Onri/AppData/Local/Programs/Python/Python38/exersices/my_hope.txt', 'rt', encoding="utf8") as file:
print(file.read())
Re: Lesen Information von einer Datei
Verfasst: Mittwoch 1. Dezember 2021, 23:28
von Lini
__deets__ hat geschrieben: Mittwoch 1. Dezember 2021, 23:20
Du musst den Pfad mit / statt \ angeben, weil letzterer escape Sequenzen einleitet. Oder ein raw String literal benutzen. Mit r"C:\..".
Danke!
mit / stattt \ scheint zu funktionieren
Code: Alles auswählen
myFile1 = open('C:/Users/Onri/AppData/Local/Programs/Python/Python38/exersices/my_hope.txt', 'rt', encoding="utf8")
print(myFile1.read())
Re: Lesen Information von einer Datei
Verfasst: Donnerstag 2. Dezember 2021, 08:59
von sparrow
@Lini: Das Problem aus deinem ersten Post war übrigens nicht, dass die Datei nicht gefunden wurde, sondern dass du das Encoding der Datei nicht angegeben hast.
Da die Datei in dem selben Verzeichnis liegt wie die dein Script, würde ich den Vorschlag von __deets__ hier aus dem Thread beherzigen:
Code: Alles auswählen
from pathlib import Path
script_path = Path(__file__).resolve().parent / „relativ.dat“
with open(script_path / 'my_hope.txt', 'rt', encoding="utf8") as f:
print(f.read())
Dateien sollte man immer mit dem with-statement öffnen, da so garantiert ist, dass sie anschließend auch wieder geschlossen werden.
Das prefix "my" bei Variablen macht nur Sinn, wenn es auch "your" gibt. Ansonsten kann man sich das sparen.
Man sollte auch keine Nummern an Namen anhängen. Wenn man tatsächlich Namen durchnummerieren muss, ist das ein deutliches Anzeichen dafür, dass man eigentlich eine Datenstruktur wie eine Liste verwenden möchte.
Allgemein gilt: benutze sprechende Namen, bei denen sowohl du als auch andere Leser sofort wissen, was sie bedeuten. (ja, ich habe hier im Beispiel "f" verwendet, aber eine Zeile lang sollte man sich das merken können und "f" ist in diesem Kontext zumindest nicht unüblich.)
Re: Lesen Information von einer Datei
Verfasst: Donnerstag 2. Dezember 2021, 09:41
von /me
P_Python hat geschrieben: Mittwoch 1. Dezember 2021, 23:01
Du schweifst wieder ab, du sollst dich in den Fragesteller versetzen und ich glaube nicht, dass der Fragesteller irgendwas von euren Antworten verstanden hat.
Im ersten Post von __deets__ stand doch schon eine flexible Lösung die mit Pfaden relativ zum Skript arbeitet:
Code: Alles auswählen
pathlib.Path(__file__).resolve().parent / „relativ.dat“
Re: Lesen Information von einer Datei
Verfasst: Donnerstag 2. Dezember 2021, 10:41
von __blackjack__
Wenn man `Path`-Objekte benutzt, und das würde ich hier auch machen, kann man das einlesen der kompletten Textdatei auch noch ein kleines bisschen unkomplizierter haben, denn die besitzen dafür eine `read_text()`-Methode:
Code: Alles auswählen
from pathlib import Path
script_path = Path(__file__).resolve().parent
print((script_path / "my_hope.txt").read_text(encoding="utf8"))
Da braucht man dann nicht mal einen Namen für das Dateiobjekt.