2015-05-11 8 views
7

Wie der Titel sagt, wollte ich ein Python-Programm, das den Dateinamen ändert, aber ich wollte überschreiben, wenn es bereits eine Datei mit diesem Zielnamen gibt.Python-Programm zum Umbenennen von Dateinamen beim Überschreiben, wenn es bereits diese Datei gibt

import os, sys 

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

os.rename(original, output) 

Aber mein Code zeigt mir nur diesen Fehler, wenn es bereits eine Datei mit diesem Zielnamen gibt.

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

Welche Reparatur soll ich machen?

+0

Entfernen Sie die Datei und Versuch es noch einmal? – jonrsharpe

Antwort

6

Unter Windows os.rename wird die Zieldatei nicht ersetzt, wenn sie existiert. Sie müssen es zuerst entfernen. Sie können den Fehler abzufangen und versuchen Sie es erneut, nachdem Sie die Datei zu entfernen:

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

Dieser Fehler tritt nur auf Windows, wie Sie in der Python-Dokumentation (https://docs.python.org/2/library/os.html#os.rename)

Sie sollten prüfen, ob es bereits eine Datei oder einen Ordner auf dem Ziel, mit folgendem Code finden:

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

Siehe auch diese Antwort: https://stackoverflow.com/a/84173/955026

Wenn die Datei existiert zunächst entfernen, bevor die ursprüngliche Datei umbenennen. Natürlich sollten Sie überprüfen, ob Sie die Originaldatei nicht entfernen (so sollte script.py file1 file1 Datei1 nicht entfernen).

3

Sie shutil.move verwenden können, wird er am Fenster überschreiben:

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

Danke, aber überschreibt das wirklich? Es scheint, dass es ignoriert es nur, wenn es Zieldatei .. – user42459

+0

@ user42459, ersetzt es die Zieldatei, wenn Sie eine Datei mit dem gleichen Namen verschieben, die Sie sehen werden –