如果已经存在该文件,则 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 程序在覆盖时重命名文件名的主要内容,如果未能解决你的问题,请参考以下文章