2015-05-11 22 views
7

Come dice il titolo, volevo un programma python che cambi il nome del file, ma volevo sovrascrivere se esiste già un file con quel nome di destinazione.Programma Python per rinominare i nomi dei file durante la sovrascrittura se esiste già quel file

import os, sys 

original = sys.argv[1] 
output = sys.argv[2] 

os.rename(original, output) 

Ma il mio codice mi mostra questo errore solo quando esiste già un file con quel nome di destinazione.

os.rename<original, output> 
WindowsError: [Error 183] Cannot create a file when that file already exists 

Cosa correzione dovrei fare?

+0

Rimuovere il file e riprova? – jonrsharpe

risposta

6

In Windows os.rename non sostituirà il file di destinazione se esiste. Devi prima rimuoverlo. È possibile intercettare l'errore e riprovare dopo aver rimosso il file:

import os 

original = sys.argv[1] 
output = sys.argv[2] 

try: 
    os.rename(original, output) 
except WindowsError: 
    os.remove(output) 
    os.rename(original, output) 
0

Questo errore si verifica solo in Windows, come si può trovare nella documentazione di python (https://docs.python.org/2/library/os.html#os.rename)

Si dovrebbe verificare se esiste già un file o una cartella di destinazione, con seguente codice:

import os.path 
os.path.exists(destination) 

Vedere anche questa risposta: https://stackoverflow.com/a/84173/955026

Se il file esiste, rimuoverlo prima di rinominare il file originale. Ovviamente dovresti controllare se non stai rimuovendo il file originale (quindi script.py file1 file1 non dovrebbe rimuovere file1).

3

È possibile utilizzare shutil.move, si sovrascriverà sulle finestre:

from shutil import move 

move(src,dest) 

Demo:

In [10]: ls  
Directory of C:\Users\padraic\Desktop 

11/05/2015 20:20 <DIR>   . 
11/05/2015 20:20 <DIR>   .. 
11/05/2015 20:20     0 bar.txt 
11/05/2015 20:20     0 foo.txt 
       2 File(s)    0 bytes 
       2 Dir(s) 47,405,617,152 bytes free 

In [11]: shutil.move("bar.txt","foo.txt")  
In [12]: ls 
Directory of C:\Users\padraic\Desktop  
11/05/2015 20:20 <DIR>   . 
11/05/2015 20:20 <DIR>   .. 
11/05/2015 20:20     0 foo.txt 
       1 File(s)    0 bytes 
       2 Dir(s) 47,405,613,056 bytes free 
In [13]: shutil.move("foo.txt","bar.txt") 
In [14]: ls 
Volume in drive C has no label. 
Volume Serial Number is 3C67-52B9 

Directory of C:\Users\padraic\Desktop 

11/05/2015 20:24 <DIR>   . 
11/05/2015 20:24 <DIR>   .. 
11/05/2015 20:20     0 bar.txt 
       1 File(s)    0 bytes 
       2 Dir(s) 47,405,568,000 bytes free 
+0

Grazie ma questo sovrascrive davvero? Sembra che lo ignori solo quando c'è il file di destinazione .. – user42459

+0

@ user42459, sostituisce il file di destinazione, se sposti un file con lo stesso nome vedrai –