2010-05-08 5 views
14

Wenn ein Pfad wie b/c/ in ./a/b/c nicht existiert, wird sich shutil.copy("./blah.txt", "./a/b/c/blah.txt") beschweren, dass das Ziel nicht existiert. Was ist der beste Weg, um den Zielpfad zu erstellen und die Datei in diesen Pfad zu kopieren?Zielpfad für shutil.copy-Dateien erstellen

Antwort

17

Verwenden Sie os.makedirs, um den Verzeichnisbaum zu erstellen.

+3

Verwenden 'os.makedirs (Ordner, exists_ok = True)' für wenn Zielordner vorhanden sein kann. – Martlark

+2

Beachten Sie, dass die Option 'exists_ok 'nur in Python 3.2 + vorhanden ist. –

+7

Es ist' exist_ok', nicht 'exists_ok' – CharlesB

14

Ich benutze etwas Ähnliches, um zu überprüfen, ob das Verzeichnis existiert, bevor man damit etwas macht.

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

Soweit ich weiß, wird dies in Python 2.7 nicht funktionieren: OSError: [Errno 2] Nein Datei oder Verzeichnis: './a/b/c' – SummerBreeze

+1

Ich bevorzuge stattdessen 'os.makedirs', die übergeordnete Verzeichnisse erstellen würden, wenn sie nicht existieren. – feilong

+1

Beachten Sie, dass dies unter einer Racebedingung leidet (wenn ein anderer oder ein anderer Thread das Verzeichnis zwischen dem check und dem Aufruf von 'makedirs' erstellt). Rufen Sie besser "os.makedirs" auf und fangen Sie die Ausnahme ab, wenn der Ordner existiert. Überprüfen Sie SoF für die Verzeichniserstellung. – farmir

3

EAFP Weise vermeiden Rennen und nicht benötigten syscalls:

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

Es gibt immer noch ein Rennen, wenn 'dest' dir nach dem Aufruf von' shuthil.copy' erstellt wird, aber vor dem Aufruf von 'os.makedirs'. – Lii

Verwandte Themen