2012-09-20 15 views
147

Powiel możliwe:
mkdir -p functionality in pythonautomatycznego tworzenia katalogów z wyjściem plików

że chcę, aby plik:

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

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

Daje to IOError, ponieważ /foo/bar robi nie istnieje.

Jaki jest najbardziej pytonowy sposób automatycznego generowania tych katalogów? Czy konieczne jest dla mnie jednoznaczne wywoływanie os.path.exists i os.mkdir na każdym pojedynczym (tj./Foo, then/foo/bar)?

Odpowiedz

290

Wykonuje to funkcja os.makedirs. Spróbuj wykonać następujące czynności:

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") 

Powodem dodać blok try-except jest obsłużyć przypadek, gdy katalog został stworzony między os.path.exists i połączeń os.makedirs, tak aby chronić nas od warunków wyścigowych.


W Pythonie 3.2 lub nowszym, jest more elegant way że unika się sytuacji wyścigu powyżej:

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

prostu musiałem pominąć 'os.mkdir' i zapoznać się z dokumentacją na jeszcze jedną funkcję :) – mgilson

+1

Tutaj jest nieco inne podejście: http://stackoverflow.com/a/14364249/1317713 Myśli? – Leonid

+1

Czy podstawowe "jeśli nie os.path.exists" potrzebne, ponieważ 'os.makedirs' używa [EAFP] (https://docs.python.org/2/glossary.html#term-eafp)? –

Powiązane problemy