Python程序:如果文件已存在,重命名文件名并覆盖原有文件

19

如标题所述,我想要一个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

我应该做出什么修复?


删除文件后重试? - jonrsharpe
5个回答

19

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

9

您可以使用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

谢谢,但这真的会覆盖吗?当有目标文件时,它似乎只是忽略它。 - user42459
@user42459,它会替换目标文件,如果您移动了一个同名的文件,您将会看到。 - Padraic Cunningham

0

这个错误只会在Windows上发生,你可以在Python文档中找到相关信息(https://docs.python.org/2/library/os.html#os.rename

你应该使用以下代码检查目标位置是否已经存在文件或文件夹:

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

请参考以下答案:https://dev59.com/SnVD5IYBdhLWcg3wHnwX#84173

在重命名原始文件之前,如果该文件存在,请先将其删除。当然,您应该检查是否未删除原始文件(因此 script.py file1 file1 不应该删除 file1)。


0
请查看我以下采用的方法,它可以正常工作。
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))

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


0

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)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接