Speichern unter anderem Pfad als Öffnen schlägt fehl

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
Pythagoraze
User
Beiträge: 9
Registriert: Dienstag 9. Februar 2021, 10:01

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?
#~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
# - mein Python is nur so gut, wie ich - #
#~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

♪ ♫ Nuuull-Hundert-Neunzich-Draaiii-Drei-Drei .... ♪ ♫ ♪
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Schon mal probiert alle Backslashes zu escapen?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
ThomasL
User
Beiträge: 1378
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Für Filenamen benutzt man pathlib
https://docs.python.org/3/library/pathlib.html
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
__blackjack__
User
Beiträge: 14019
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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",
    )
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Antworten