web-dev-qa-db-fra.com

Programme Python permettant de renommer les noms de fichier lors du remplacement s'il existe déjà ce fichier

Comme le titre l'indique, je voulais un programme python qui modifie le nom du fichier, mais je voulais écraser s'il existait déjà un fichier portant ce nom de destination.

import os, sys

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

os.rename(original, output)

Mais mon code me montre simplement cette erreur quand il y a déjà un fichier avec ce nom de destination.

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

Quel correctif dois-je faire?

10
user42459

Sous Windows, os.rename ne remplacera pas le fichier de destination s'il existe. Vous devez d'abord l'enlever. Vous pouvez détecter l'erreur et réessayer après avoir supprimé le fichier:

import os

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

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

Vous pouvez utiliser shutil.move , il écrasera les fenêtres:

from shutil import move

move(src,dest)

Démo:

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
4

Cette erreur ne se produit que sous Windows, comme vous pouvez le trouver dans la documentation de Python ( https://docs.python.org/2/library/os.html#os.rename )

Vous devriez vérifier s'il y a déjà un fichier ou un dossier sur la destination, avec le code suivant:

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

Voir aussi cette réponse: https://stackoverflow.com/a/84173/955026

Si le fichier existe, supprimez-le avant de renommer le fichier d'origine. Bien sûr, vous devriez vérifier si vous ne supprimez pas le fichier original (donc script.py file1 file1 ne devrait pas supprimer le fichier1).

0
Snicksie

* S'il vous plaît trouver l'approche ci-dessous que j'ai suivi et cela fonctionne très bien *

        source_file_name = 'Test.xlsx'
        dst_file_name = "FinalName.xlsx"
        source_file_path = "presentdirectory"  #os.getcwd()
        dst_file_path = "Destination_Folderpath"
        shutil.copy(os.path.join(source_file_path, source_file_name), os.path.join(dst_file_path,  dst_file_name))

Il écrasera le fichier existant avec de nouvelles données s'il existe déjà.

0
Shabir