2010-05-08 10 views
14

Jeśli ścieżka taka jak b/c/ nie istnieje w ./a/b/c, shutil.copy("./blah.txt", "./a/b/c/blah.txt"), będzie skarżyć się, że miejsce docelowe nie istnieje. Jaki jest najlepszy sposób utworzenia ścieżki docelowej i skopiowania pliku do tej ścieżki?utwórz ścieżkę docelową dla plików shutil.copy

Odpowiedz

17

Użyj os.makedirs, aby utworzyć drzewo katalogów.

+3

użyć 'os.makedirs (folder, exists_ok = True)', gdy może istnieć folder docelowy. – Martlark

+2

Zauważ, że opcja 'exist_ok' jest obecna tylko w Pythonie 3.2+ –

+7

To' exist_ok', a nie 'exists_ok' – CharlesB

14

Używam czegoś podobnego do tego, aby sprawdzić, czy katalog istnieje, zanim coś z nim zrobię.

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

O ile mi wiadomo, to nie zadziała w Pythonie 2.7: OSError: [Errno 2] No such plik lub katalog: './a/b/c' – SummerBreeze

+1

Zamiast tego wolę używać 'os.makedirs', który tworzy katalogi nadrzędne, jeśli nie istnieją. – feilong

+1

Należy pamiętać, że cierpi na to stan wyścigu (jeśli ktoś inny lub inny wątek utworzy katalog pomiędzy sprawdzeniem i wywołaniem 'makedirs'). Lepiej wywołać 'os.makedirs' i wychwycić wyjątek, jeśli folder istnieje. Sprawdź SoF w celu utworzenia katalogu. – farmir

3

EAFP sposób uniknąć ras i niepotrzebnych wywołań systemowych:

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

Ciągle jest wyścig, jeśli 'dest' dir zostanie utworzony po wywołaniu' shutil.copy', ale przed wywołaniem 'os.makedirs'. – Lii

Powiązane problemy