Seite 1 von 1

Speichern unter anderem Pfad als Öffnen schlägt fehl

Verfasst: Freitag 23. Juni 2023, 15:44
von Pythagoraze
Hallo - ich bin gerade am verzweifeln, weiß aber nicht, ob es an mir als Neuling liegt oder an falschem Code oder an Python?

Vorweg: ja, ich weiß, ich habe eine alte Python Version. ( Python 3.7.9 mit Thonny 3.3.13 )
Diese wurde aber mit Thonny installiert. (ich bin mir nicht sicher, ob ich das fehlerfreier hinbekomme, eine aktuelle da reinzufriemeln, um zu testen)
Und das ganze läuft derzeit auf Windows 10.

Ich weiß auch nich, ob es nur daran liegt.
Eigentlich müßte ja auch eine ältere Version das vernünftig hinbekommen. Dateien woanders speichern, sollte kein Unding sein.
Ich hab es erst mit selbem Pfad für g und nur mit anderem Dateinamen versucht - klappt tadellos und fehlerfrei.
Dann wollte ich wegen besserer Übersicht in ein Unterverzeichnis speichern, da traten die Fehler auf.

Fehlermeldung(en):

Code: Alles auswählen

f = open ("D:\MOC\entpackt\Document.txt", "r")
# g = open ("D:\MOC\entpackt\Ausgabe.txt", "r") # funktioniert
# g = open ("D:\MOC\entpackt\unterVerz\Ausgabe.txt", "r") # funktioniert NICHT ("unterVerz"  sollte mit-erzeugt werden)
# g = open ("D:\MOC\entpackt\unterVerz\Ausgabe.txt", "r") # funktioniert auch NICHT, obwohl "unterVerz" existiert
g = open ("C:\alternat\Ausgabe.txt", "w") # funktioniert AUCH NICHT (Pfad C:\alternat\ existiert aber
Mein Programm:
ich öffne 2 Dateien - eine zum Lesen (f) und eine zum speichern (g).

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\Alex\Documents\PYT\aufgabe.py", line 10, in <module>
    g = open ("C:\alternat\Ausgabe.txt", "w")
OSError: [Errno 22] Invalid argument: 'C:\alternat\\Ausgabe.txt' # Fehler kommt wegen \ statt  \ 
[...]
text = f.read()
textbear = bla(text)
g.write ( textbear )
g.flush()
g.close()
f.close()
Egal, ob "unterVerz" existiert (vorher per mkDir unterVerz erstellt) oder nicht - ich dachte erst, es läge daran, daß er die Datei nicht im nicht-existierenden Unterverzeichnis anlegen möchte/kann.
Aber das ist ist es nicht: Es geht auch nicht mit einem anderen Pfad/Directory, als dem, welches ich zuvor für Datei F geöffnet habe.
Ich kann g nur zum Speichern mit dem Pfad öffnen, mit dem ich f geöffnet habe und aber dort mit einem anderen Dateinamen speichern.

Kann es sein, daß ich sowas gibt?
Dass Python nicht in anderen Verzeichnissen speichern kann, als man öffnet?
muß ich Dateien im gleichen Verzeichnis erstellen, wie ich andere öffne und anschließend per batch verschieben?

Man muß doch auch in anderen Verzeichnissen speichern können und sogar gleichzeitig ein Unterverzeichnis anlegen können?
Mindestens aber an anderem Ort speichern.

Was kann ich tun?

Re: Speichern unter anderem Pfad als Öffnen schlägt fehl

Verfasst: Freitag 23. Juni 2023, 19:30
von darktrym
Schon mal probiert alle Backslashes zu escapen?

Re: Speichern unter anderem Pfad als Öffnen schlägt fehl

Verfasst: Freitag 23. Juni 2023, 19:31
von ThomasL
Für Filenamen benutzt man pathlib
https://docs.python.org/3/library/pathlib.html

Re: Speichern unter anderem Pfad als Öffnen schlägt fehl

Verfasst: Freitag 23. Juni 2023, 20:11
von __blackjack__
@Pythagoraze: "\a" ist was anderes als "\\a". Mit "\" in Zeichenketten muss man vorsichtig sein, weil da bestimmte Kombinationen eine besondere Bedeutung haben. Da kann man ”rohe” Zeichenkettenliterale verwenden, mit einem r beziehungsweise R davor, also beispielsweise R"\a", dann hat der "\" garantiert keine besondere Bedeutung, oder man verwendet "/" statt "\" in Pfadnamen. Das geht unter Windows auch.

Weitere Anmerkungen: `f` und `g` sind wie so ziemlich alle Namen schlechte Namen, weil die nichts darüber verraten was die Bedeutung von dem Wert ist. Mindestens mal `input_file` und `output_file` sollte das heissen. Oder nur `file`, denn im Beispiel macht es nicht wirklich Sinn beide Dateien gleichzeitig geöffnet zu haben.

Bei Textdateien sollte man beim öffnen immer die Kodierung mit angeben. Sonst wird die ”geraten”, allerdings nicht am Inhalt der Datei, sondern global anhand des Systems.

Statt `close()` manuell aufzurufen, verwendet man besser die ``with``-Anweisung mit `open()`.

`flush()` ist in `close()` inbegriffen, das macht keinen Sinn das vorher noch mal selbst zu machen.

Zwischen Funktionname und öffnender Klammer des Aufrufs gehört kein Leerzeichen.

Also ohne `pathlib` sähe das dann so aus:

Code: Alles auswählen

    with open(R"D:\MOC\entpackt\Document.txt", "r", encoding="utf-8") as file:
        text = file.read()

    text = bla(text)

    with open(R"C:\alternat\Ausgabe.txt", "w", encoding="utf-8") as file:
        file.write(text)
Mit `pathlib` kann man Methoden benutzen, die einem das öffnen (und schliessen) komplett abnehmen:

Code: Alles auswählen

    Path(R"C:\alternat\Ausgabe.txt").write_text(
        bla(Path(R"D:\MOC\entpackt\Document.txt").read_text(encoding="utf-8")),
        encoding="utf-8",
    )