Python 重命名文件名的程序,如果已经存在该文件则覆盖

Python program to rename file names while overwriting if there already is that file

正如标题所说,我想要一个 python 程序来更改文件名,但如果已经有一个具有该目标名称的文件,我想覆盖它。

import os, sys

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

os.rename(original, output)

但是当已经存在具有该目标名称的文件时,我的代码只显示此错误。

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

我应该做什么修复?

此错误仅发生在 windows,您可以在 python 文档 ( https://docs.python.org/2/library/os.html#os.rename )

中找到

您应该检查目的地是否已经有文件或文件夹,代码如下:

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

另请参阅此答案:

如果文件存在,请先将其删除,然后再重命名原始文件。当然你应该检查你是否没有删除原始文件(所以 script.py file1 file1 不应该删除 file1)。

On Windows os.rename 不会替换目标文件(如果存在)。您必须先将其删除。您可以捕获错误并在删除文件后重试:

import os

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

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

您可以使用 shutil.move,它将覆盖 windows:

from shutil import move

move(src,dest)

演示:

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

请找到我遵循的以下方法,它运行良好

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))

如果现有文件也已存在,它将用新数据覆盖现有文件。

如果目标文件存在,

os.rename() 不会覆盖(至少在 Windows 中)。所以首先检查目标文件是否存在,存在则删除。

import os.path
# first check if file exists
if os.path.exists(outputFilename):
    os.remove(outputFilename) # file exits, delete it
# rename the file
os.rename(originalFilename, outputFilename)

另一种选择是使用 shutil.move,它会覆盖目标文件(至少 Windows)。

import shutil
shutil.move(originalFilename, outputFilename)

虽然最好先检查并删除(如果存在)以避免任何潜在错误。