2010-05-08 19 views
14

./a/b/c, shutil.copy("./blah.txt", "./a/b/c/blah.txt") adresinde b/c/ gibi bir yol yoksa, hedefin mevcut olmadığı konusunda şikayette bulunulur. Hem hedef yolu oluşturmanın hem de dosyayı bu yola kopyalamanın en iyi yolu nedir?shutil.copy dosyaları için hedef yolunu oluşturun

cevap

17

Dizin ağacını oluşturmak için os.makedirs kullanın.

+3

Kullanım 'os.makedirs (klasör, exists_ok = True)' hedef klasör var olabilir ne zaman için. – Martlark

+2

'exists_ok' seçeneğinin yalnızca Python 3.2+ –

+7

içinde bulunduğunu unutmayın' ex_ok' değil, exists_ok' değil – CharlesB

14

Dizin böyle bir şey yapmadan önce var olup olmadığını kontrol etmek için buna benzer bir şey kullanırım.

if not os.path.exists('a/b/c/'): 
    os.mkdir('a/b/c') 
+1

Bildiğim kadarıyla, bu Python 2.7: OSError'da çalışmaz: [Errno 2] Hayır dosya veya dizin: './a/b/c' – SummerBreeze

+1

Bunun yerine "os.makedirs" yi kullanmayı tercih ederim. – feilong

+1

Bunun bir yarış durumundan muzdarip olduğunu unutmayın (başka biri veya başka bir iş parçacığı, 'makedirler' kontrol ve aranması arasında dizin oluşturuyorsa). Klasör var ise 'os.makedirs' çağırmak ve istisna yakalamak daha iyidir. Dizin oluşturma için SoF kontrol edin. – farmir

3

EAFP yolu, ırklar ve gereksiz syscalls kaçının:

import errno 
import os 
import shutil 

src = "./blah.txt" 
dest = "./a/b/c/blah.txt" 
# with open(src, 'w'): pass # create the src file 
try: 
    shutil.copy(src, dest) 
except IOError as e: 
    # ENOENT(2): file does not exist, raised also on missing dest parent dir 
    if e.errno != errno.ENOENT: 
     raise 
    # try creating parent directories 
    os.makedirs(os.path.dirname(dest)) 
    shutil.copy(src, dest) 
+0

Eğer 'shut'.'' için yapılan çağrıdan sonra' '' '' s'ma's''ndan önce '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''''''' için çağrılırsa bir yarış var demektir. – Lii

İlgili konular