【问题标题】:Move and replace if same file name already exists?如果相同的文件名已经存在,移动和替换?
【发布时间】:2015-08-04 15:36:13
【问题描述】:

下面是移动和替换单个文件的代码:

import shutil
import os
src = 'scrFolder'
dst = './dstFolder/'
filelist = []

files = os.listdir( src )
for filename in files:
    filelist.append(filename)
    fullpath = src + '/' + filename
    shutil.move(fullpath, dst)

如果我执行相同的命令并移动 dst folder 中已经存在的文件,我会得到 shutil.Error: Destination path './dstFolder/file.txt' already exists。如果已经存在相同的文件名,如何移动和替换?

【问题讨论】:

    标签: python-2.7 shutil


    【解决方案1】:

    如果您指定目标的完整路径(不仅仅是目录),那么shutil.move 将覆盖任何现有文件:

    shutil.move(os.path.join(src, filename), os.path.join(dst, filename))
    

    【讨论】:

    • 这在网络驱动器上也能正常工作,我有文件的完整路径,但它没有被覆盖,以“文件存在”退出
    • @ecatmur 我独立测试了同样的东西。 1. 如果目标目录已经有源文件名并且您这样做了shutil.move(src_filename, dst_dirname),则会引发错误Error: Destination path 'dst_dirname/src_filename' already exists。 2. 但是,如果您执行dst_filename = os.path.join(dst_dirname, os.path.basename(src_filename)); shutil.move(src_filename, dst_filename) --> 那么您不会引发异常。
    • 您不需要指定完整路径。如果文件名包含在目标路径(相对或绝对)中,shutil 将覆盖。
    • 这在我看来有点巫术——为什么绝对路径和相对路径应该有不同的语义?这打破了 python 如此自豪地遵循的least surprise principle。我期待像 exist_ok=True 这样的东西,类似于 mkdir() 所做的。
    • @TrevorBoydSmith,python3.6 报告目标存在错误,但它在 Python 3.9.7 中运行良好。
    【解决方案2】:

    我通过在 move 命令中为源和目标提供完整路径来覆盖它... 记得为 Windows 路径添加双斜杠。

    # this is to change directories (type your own)
    os.chdir("C:\REPORTS\DAILY_REPORTS")
    
    # current dir  (to verify)
    cwd = os.getcwd() 
    src = cwd
    dst = cwd + '\\XLS_BACKUP\\'
    
    shutil.move(os.path.join(src, file), os.path.join(dst, file))
    
    # nice and short.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 2016-05-01
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      相关资源
      最近更新 更多