Lesen Information von einer 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
Lini
User
Beiträge: 26
Registriert: Freitag 13. November 2020, 00:39

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.

Bild
P_Python
User
Beiträge: 19
Registriert: Donnerstag 11. November 2021, 19:45

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:)
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

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
P_Python
User
Beiträge: 19
Registriert: Donnerstag 11. November 2021, 19:45

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.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
P_Python
User
Beiträge: 19
Registriert: Donnerstag 11. November 2021, 19:45

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?
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Wenn das Programm im Suchpfad ist stimmt die Annahme natürlich auch nicht.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
P_Python
User
Beiträge: 19
Registriert: Donnerstag 11. November 2021, 19:45

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.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

@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.
P_Python
User
Beiträge: 19
Registriert: Donnerstag 11. November 2021, 19:45

@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.
Lini
User
Beiträge: 26
Registriert: Freitag 13. November 2020, 00:39

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

Bild

Könntet ihr das eingefügte Bild sehen?
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst den Pfad mit / statt \ angeben, weil letzterer escape Sequenzen einleitet. Oder ein raw String literal benutzen. Mit r"C:\..".
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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())
Lini
User
Beiträge: 26
Registriert: Freitag 13. November 2020, 00:39

__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())
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

@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.)
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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“
Benutzeravatar
__blackjack__
User
Beiträge: 13113
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten