Automatisches Erstellen von Verzeichnissen mit Dateiausgabe [duplicate]

Lesezeit: 2 Minuten

Benutzer-Avatar
Phil

Angenommen, ich möchte eine Datei erstellen:

filename = "/foo/bar/baz.txt"

with open(filename, "w") as f:
    f.write("FOOBAR")

Dies gibt ein IOErrorseit /foo/bar ist nicht vorhanden.

Was ist der pythonischste Weg, um diese Verzeichnisse automatisch zu generieren? Ist es nötig mich explizit anzurufen os.path.exists und os.mkdir auf jedem einzelnen (dh /foo, dann /foo/bar)?

Benutzer-Avatar
Krumelur

COMMUNITY-BEARBEITUNG:
Da die Frage geschlossen ist, wird die Antwort von @ David258 als Kommentar geschrieben.

from pathlib import Path
output_file = Path("/foo/bar/baz.txt")
output_file.parent.mkdir(exist_ok=True, parents=True)
output_file.write_text("FOOBAR")

Ich überlasse es dem Autor dieser Antwort, dies nach eigenem Ermessen einzufügen oder zu entfernen.


Die ursprüngliche Antwort beginnt hier:

In Python 3.2+ ist das möglich elegant Mach Folgendes:


import os

filename = "/foo/bar/baz.txt"
os.makedirs(os.path.dirname(filename), exist_ok=True)
with open(filename, "w") as f:
    f.write("FOOBAR")


In älteren Pythons gibt es einen weniger eleganten Weg:

Das os.makedirs Funktion tut dies. Versuche Folgendes:

import os
import errno

filename = "/foo/bar/baz.txt"
if not os.path.exists(os.path.dirname(filename)):
    try:
        os.makedirs(os.path.dirname(filename))
    except OSError as exc: # Guard against race condition
        if exc.errno != errno.EEXIST:
            raise

with open(filename, "w") as f:
    f.write("FOOBAR")

Der Grund, die hinzuzufügen try-except Block soll den Fall handhaben, wenn das Verzeichnis zwischen dem erstellt wurde os.path.exists und die os.makedirs Anrufe, um uns vor Rennbedingungen zu schützen.


  • Musste nur vorbeischauen os.mkdir und lesen Sie die Dokumentation zu einer weiteren Funktion 🙂

    – Mgilson

    20. September 2012 um 17:09 Uhr


  • Hier gibt es einen etwas anderen Ansatz: stackoverflow.com/a/14364249/1317713 Gedanken?

    – Leonid

    11. April 2016 um 6:02 Uhr


  • Ist die Initiale if not os.path.exists benötigt seit dem os.makedirs Verwendet EAFP?

    – Marcel Wilson

    16. August 2017 um 16:37 Uhr

  • Berechtigungsfehler: [Errno 13] Berechtigung verweigert: ‘/foo’

    – Ka-Wa Yip

    17. August 2018 um 11:05 Uhr

  • mit Pathlib: from pathlib import Path; output_file = Path("/foo/bar/baz.txt"); output_file.parent.mkdir(exist_ok=True, parents=True); output_file.write_text("FOOBAR")

    – David258

    12. Januar 2021 um 12:46 Uhr

1110670cookie-checkAutomatisches Erstellen von Verzeichnissen mit Dateiausgabe [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy