2009-02-04 8 views
32

Sto provando a copiare una directory e tutti i suoi contenuti in un percorso già esistente. Il problema è che tra il modulo os e il modulo shutil non sembra esserci un modo per farlo. la funzione shutil.copytree() si aspetta che il percorso di destinazione non esista prima.Come copiare una directory e il suo contenuto in una posizione esistente usando Python?

Il risultato esatto che sto cercando è quello di copiare un intero struttura di cartelle sopra l'altro, sovrascrivendo in silenzio su eventuali duplicati trovati. Prima di saltare e iniziare a scrivere la mia funzione per farlo, ho pensato di chiedere se qualcuno sa di una ricetta esistente o di uno snippet che lo fa.

risposta

42

distutils.dir_util.copy_tree fa ciò che si vuole.

Copy an entire directory tree src to a new location dst. Both src and dst must be directory names. If src is not a directory, raise DistutilsFileError. If dst does not exist, it is created with mkpath(). The end result of the copy is that every file in src is copied to dst, and directories under src are recursively copied to dst. Return the list of files that were copied or might have been copied, using their output name. The return value is unaffected by update or dry_run: it is simply the list of all files under src, with the names changed to be under dst.

(più documentazione all'indirizzo di cui sopra)

+1

Non ho visto prima questo, buona scoperta. La mia unica avvertenza è che non fornisce alcuna indicazione su quali file sono stati sovrascritti e quali sono stati creati di nuovo. Finché questo non è un requisito, tuttavia, questo sembra perfetto. –

+0

Questa è una buona soluzione, sebbene richieda l'installazione di distutils. Non è un problema così grande dato che lo stiamo raggruppando in un EXE con pyinstaller comunque. – Soviut

+0

distutils fa parte della libreria standard, quindi dovrebbe, in teoria, essere sempre installato. –

0

Perché non implementare sul proprio utilizzando os.walk?

+5

è quello che mi stava prendendo in considerazione, ma ho voluto assicurarsi che non ero reinventare la ruota. – Soviut

0

Per le operazioni di file di alto livello come quella di utilizzare il modulo shutil e nel tuo caso la funzione copytree. Penso che sia più pulito di "abusare" delle distutils.

UPDATE:: Dimentica la risposta, ho trascurato che l'OP ha provato a chiudere.

+1

Ho accennato alla mia domanda che shutil.copytree() è quello che stavo cercando di usare ma che non corrisponde al conto. – Soviut

+1

Normalmente sono d'accordo con questo, ma non fa esattamente quello che l'O.P. chiedeva. –

+1

Voi ragazzi avete ragione, ho trascurato che nella domanda, era troppo tardi quella sera :-) –

0

Stai gettting l'errore che dice "Non è possibile creare una directory quando il suo già presente"? Non sono sicuro di quanto stupido è questo, ma non ho fatto è stato quello di inserire una sola riga nel modulo copytree: ho cambiato:

def copytree(src, dst, symlinks=False): 
    names = os.listdir(src) 
    os.makedirs(dst) 

in:

def copytree(src, dst, symlinks=False): 
    names = os.listdir(src) 
    if (os.path.isdir(dst)==False): 
     os.makedirs(dst)  

Credo che ho fatto qualche bluder. Se è così, qualcuno potrebbe indicarmi questo? Siamo spiacenti, io sono molto nuovo a Python: P