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

Posted

技术标签:

【中文标题】如果已经存在该文件,则 Python 程序在覆盖时重命名文件名【英文标题】:Python program to rename file names while overwriting if there already is that file 【发布时间】:2015-07-22 09:53:10 【问题描述】:

正如标题所说,我想要一个更改文件名的 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

我应该做些什么修复?

【问题讨论】:

删除文件再试一次? 【参考方案1】:

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

您应该检查目标上是否已经存在文件或文件夹,代码如下:

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

另请参阅此答案:https://***.com/a/84173/955026

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

你可以使用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,它会替换目标文件,如果你移动一个同名文件,你会看到【参考方案4】:

请找到我遵循的以下方法,它工作正常

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

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

【讨论】:

【参考方案5】:

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)

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

【讨论】:

以上是关于如果已经存在该文件,则 Python 程序在覆盖时重命名文件名的主要内容,如果未能解决你的问题,请参考以下文章

python 基础之文件基本操作01

python文本操作

python 小记1

在python中文件打开模式rd➕代表啥意思?

python-基础-文件操作

mv:移动文件或改名