2010-02-15 12 views
5

Sono un principiante di Python e sto scrivendo uno script per copiare i file compilati da una posizione a un'altra. Quello che ho è abbastanza semplice in questo momento, qualcosa di simile:Possiamo fare una copia intelligente in Python?

import os 
import shutil 

shutil.copy2 (src, dst) 
#... many more shutil.copy commands 
#src is a filename string 
#dst is the directory where the file is to be copied 

mio problema è che molti dei file da copiare sono file di grandi dimensioni, e non tutti sono ri-compilato in ogni compilazione ciclo. Idealmente, mi piacerebbe copiare solo i file modificati in questo script. C'è un modo per farlo?

risposta

9

Si potrebbe fare uso del tempo modifica del file, se questo è abbastanza per voi:

# If more than 1 second difference 
if os.stat(src).st_mtime - os.stat(dest).st_mtime > 1: 
    shutil.copy2 (src, dst) 

O chiamare una sincronizzazione strumento come rsync.

+3

Perché '> 1' - che dovrebbe non essere'> 0 '? – Wikis

+0

Dipende dal caso d'uso, immagino. Se i file sono sempre scritti con 'shutil.copy2', allora ci si può aspettare che il tempo di modifica sia esattamente uguale (allora è'> 0'). – AndiDog

4

Se non si dispone di un motivo preciso per cui è necessario codificarlo da soli in python, suggerirei di utilizzare rsync. Dalla sua pagina di manuale:

Rsync è uno strumento di copia file versatile e rapido versatile. E ' famosa per il suo algoritmo di delta-trasferimento , che riduce la quantità di dati inviati attraverso la rete inviando solo le differenze tra i file di origine e i file esistenti nel la destinazione.

Se non desiderate codificare questo in Python, tuttavia, allora il posto per cominciare sarebbe quello di studiare filecmp.cmp

1

Come si desidera cercare i file modificati? Puoi semplicemente usare os.path.getmtime (path) su src e controllare se è più recente di qualche timestamp memorizzato (l'ultima volta che hai copiato per esempio) o usare un filecmp.cmp (f1, f2 [, shallow]) per controllare se un file è più recente

Attenzione con filecmp.cmp, si copia anche la stat (copia2), quindi è necessario verificare se un confronto superficiale è abbastanza buono per voi.

1

Dalla risposta di AndiDog:

os.stat(dst).st_mtime - os.stat(src).st_mtime 

è un valore negativo se il file 'src' è più recente, quindi dovrebbe essere:

if os.stat(src).st_mtime - os.stat(dst).st_mtime > 1: 
0

Per costruire sulla risposta di AndiDog, se si dispone di file che potrebbe non esistere nella cartella di destinazione:

# copy file if destination is older by more than a second, or does not exist 
if (not os.path.exists(dest)) or (os.stat(src).st_mtime - os.stat(dest).st_mtime > 1) : 
    shutil.copy2 (src, dest) 
Problemi correlati