如何用Python的shutil.copy()和os.rename()覆盖不同文件夹中的文件
解决os.rename()无法覆盖文件的WinError183问题
Windows系统下os.rename()不允许直接覆盖已存在的目标文件,这是触发FileExistsError: [WinError 183]的核心原因。针对你需要生成固定文件名供PowerBI读取的需求,提供两种可行解决办法:
方法1:先删除目标文件再重命名
先检查目标文件是否存在,若存在则删除,再执行重命名操作,确保新文件能正常替换旧文件:
import os import shutil from datetime import date # 原有代码保持不变 src_file = vb.output_path destination = vb.path_reports_cashflowcopy shutil.copy(src_file, destination) cashflow_copy_path = vb.ROOT_DIR + '\\Data_and_Reports\\Reports\\Cashflow Copies\\' # 定义原文件名和目标文件名 old_name = cashflow_copy_path + str(date.today()) + ' - Lettings Report BETA - ' + vb.academic_year_selection + '.xlsx' new_name = cashflow_copy_path + 'Copy ' + vb.academic_year_selection + '.xlsx' # 检查目标文件是否存在,存在则删除 if os.path.exists(new_name): os.remove(new_name) # 执行重命名 os.rename(old_name, new_name)
方法2:使用shutil.move()替代os.rename()
shutil.move()在Windows环境下支持直接覆盖已存在的目标文件,代码更简洁:
import shutil from datetime import date # 原有代码保持不变 src_file = vb.output_path destination = vb.path_reports_cashflowcopy shutil.copy(src_file, destination) cashflow_copy_path = vb.ROOT_DIR + '\\Data_and_Reports\\Reports\\Cashflow Copies\\' # 定义原文件名和目标文件名 old_name = cashflow_copy_path + str(date.today()) + ' - Lettings Report BETA - ' + vb.academic_year_selection + '.xlsx' new_name = cashflow_copy_path + 'Copy ' + vb.academic_year_selection + '.xlsx' # 用shutil.move替代os.rename,自动覆盖目标文件 shutil.move(old_name, new_name)
注意事项
- 执行删除或覆盖操作前,确保目标文件没有被其他程序(比如PowerBI)占用,否则会触发权限错误。
- 若需要保留历史版本,可以在替换前先将旧文件备份到其他目录。
内容的提问来源于stack exchange,提问作者Tom Owen
相关产品推荐
相关产品推荐

