2012-09-20 21 views
147

可能重複:
mkdir -p functionality in python與文件輸出自動創建目錄

說我想要做一個文件:

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

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

這給出了一個IOError,因爲/foo/bar做不存在。

什麼是自動生成這些目錄最pythonic的方式?是否有必要在每一個單元上明確地呼叫os.path.existsos.mkdir(即/ foo,然後是/ foo/bar)?

回答

290

os.makedirs函數執行此操作。請嘗試以下操作:

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

之所以要添加try-except塊是os.path.existsos.makedirs調用之間創建的目錄時需要處理的話,這樣就保護我們免受競爭條件。


在Python 3.2+,有more elegant way避免上述競態條件:

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

就不得不看過去'os.mkdir'和一個更函數讀取的文檔:) – mgilson

+1

這裏有一個稍微不同的方法:http://stackoverflow.com/a/14364249/1317713 想法? – Leonid

+1

自'os.makedirs'使用[EAFP](https://docs.python.org/2/glossary.html#term-eafp)之後,是否需要初始'如果不是os.path.exists'? –