Nasıl güvenli bir şekilde iç içe dizin oluşturabilirim?
Bir dosyanın yazılacağı dizinin var olup olmadığını kontrol etmenin ve yoksa Python kullanarak dizini oluşturmanın en şık yolu nedir? İşte denediğim şey:
import os
file_path = "/my/directory/filename.txt"
directory = os.path.dirname(file_path)
try:
os.stat(directory)
except:
os.mkdir(directory)
f = file(filename)
Her nasılsa os.path.exists
dosyasını gözden kaçırmışım (teşekkürler kanja, Blair ve Douglas). Şimdi elimde olan şey bu:
def ensure_dir(file_path):
directory = os.path.dirname(file_path)
if not os.path.exists(directory):
os.makedirs(directory)
Bunun otomatik olarak gerçekleşmesini sağlayan "open" için bir bayrak var mı?
3872
3
İyi niteliklere sahip iki cevap görüyorum, her birinin küçük bir kusuru var, bu yüzden kendi yorumumu vereceğim:
os.path.exists
][1]'i deneyin ve oluşturma için [
os.makedirs`]2'yi göz önünde bulundurun.Yorumlarda ve başka yerlerde belirtildiği gibi, bir yarış koşulu vardır – dizin
os.path.exists
veos.makedirs
çağrıları arasında oluşturulursa,os.makedirs
birOSError
ile başarısız olur. Ne yazık ki,OSError
ı genel olarak yakalamak ve devam etmek, yetersiz izinler, dolu disk vb. gibi diğer faktörlerden kaynaklanan dizin oluşturma başarısızlığını göz ardı edeceğinden kusursuz değildir.Bir seçenek `OSError'ı yakalamak ve gömülü hata kodunu incelemek olabilir (bkz Python'un OSError'ından bilgi almanın platformlar arası bir yolu var mı):
Alternatif olarak, ikinci bir
os.path.exists
olabilir, ancak başka birinin dizini ilk kontrolden sonra oluşturduğunu, ardından ikincisinden önce kaldırdığını varsayalım – yine de kandırılabiliriz.Uygulamaya bağlı olarak, eşzamanlı işlemlerin tehlikesi, dosya izinleri gibi diğer faktörlerin yarattığı tehlikeden daha fazla veya daha az olabilir. Geliştiricinin bir uygulama seçmeden önce geliştirilmekte olan belirli uygulama ve beklenen ortamı hakkında daha fazla bilgi sahibi olması gerekir.
Python'un modern sürümleri, hem
FileExistsError
(3.3+'da) ortaya çıkararak bu kodu oldukça geliştirir......ve
os.makedirs
içinexist_ok
adında bir anahtar kelime argümanına izin vererek (3.2+'da).Check
os.makedirs
: (Yolun tamamının var olduğundan emin olur.) Dizinin var olabileceği gerçeğini ele almak içinOSError
yakala. (Eğerexist_ok
False
ise (varsayılan), hedef dizin zaten mevcutsa birOSError
oluşur).os.path.exists`]1 işlevini deneyin