SORU
7 Kasım 2008, Cuma


Python, bir dizin var olmadığını kontrol edin ve gerekirse oluşturun

Eğer bir dosyaya yazılacak dizin olup olmadığını kontrol etmek için, ve değilse, dizin Python kullanarak oluşturmak en zarif yolu nedir? Denedim:

filename = "/my/directory/filename.txt"
dir = os.path.dirname(filename)

try:
    os.stat(dir)
except:
    os.mkdir(dir)       

f = file(filename)

Nasıl olduysa, os.path.exists (teşekkürler kanja, Blair ve Douglas) özledim. Bu şimdi ben ne var:

def ensure_dir(f):
    d = os.path.dirname(f)
    if not os.path.exists(d):
        os.makedirs(d)

Orada bir bayrak"", bu otomatik olarak gerçekleşmesini sağlar? açıktır

CEVAP
7 Kasım 2008, Cuma


İyi özellikleri olan iki cevap, küçük bir kusur ile her görünce, onu almak benim vereceğim:

os.path.exists, denemek ve oluşturmak için os.makedirs düşünün.

if not os.path.exists(directory):
    os.makedirs(directory)

Belirtildiği gibi açıklamaları ve başka bir yerde, bir yarış durumu - eğer dizin oluşturulur arasındaki os.path.exists os.makedirs arama os.makedirs ile başarısız olur OSError. Ne yazık ki, battaniye alıcı OSError ve devam eden dizinin diğer faktörler, izinler, tam disk, vb yetersiz gibi nedeniyle oluşturmak için bir hata göz ardı edilir gibi kusursuz değil.

Bir seçenek olurdu tuzak OSError ve incelemek dahili hata kodu, eğer bir biliyordu neyin ne (benim OS, 13 gibi olduğunu belirtmek için izin reddedildi, 17 dosya var değil net o kadar uzaktan bile taşınabilir, ama araştırdı Is there a cross-platform way of getting information from Python’s OSError). Alternatif olarak, 15* *ama başka bir ilk kontrolden sonra dizin oluşturulmuş, ikincisi önce kaldırıldı sonra sanırım bir saniye olabilir - hala kandırılmış olabiliriz.

Uygulamaya bağlı olarak, eşzamanlı operasyonlar tehlikesi tehlike dosya izinleri gibi diğer faktörler tarafından ortaya atılan ve daha fazla veya daha az olabilir. Geliştirici belirli uygulama geliştirilmekte ve beklenen çevresi hakkında daha fazla şey öğrenmek için bir uygulama seçmeden önce olurdu.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dellbear816

    Dellbear816

    4 Mart 2008
  • Fr. Eckle Studios

    Fr. Eckle St

    29 Kasım 2006
  • TheFlashCentre

    TheFlashCent

    22 Mayıs 2008