如果python中已存在相同的文件名,则移动并替换

use*_*916 36 shutil python-2.7

以下是将移动和替换单个文件的代码

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)
Run Code Online (Sandbox Code Playgroud)

如果我执行相同的命令并移动已经存在的文件dst folder我正在获取shutil.Error: Destination path './dstFolder/file.txt' already exists如何移动并替换相同的文件名已经存在

eca*_*mur 74

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

shutil.move(os.path.join(src, filename), os.path.join(dst, filename))
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说有点巫术——为什么绝对路径和相对路径应该有不同的语义?这打破了Python自豪地遵循的[最小惊喜原则](https://en.wikipedia.org/wiki/Principle_of_least_astonishment)。我期待类似 `exist_ok=True` 的内容,类似于 `mkdir()` 的功能。 (9认同)
  • @ecatmur我独立测试了同样的事情.1.如果目标目录已经有源文件名并且你执行`shutil.move(src_filename,dst_dirname)`则会引发错误`错误:目标路径'dst_dirname/src_filename'已经存在.2.但是,如果你执行`dst_filename = os.path.join(dst_dirname,os.path.basename(src_filename)); shutil.move(src_filename,dst_filename)` - >然后你不会引发异常. (7认同)
  • 这在网络驱动器上也能正常工作,我有一个完整的文件路径,但它不会过度压缩,退出"文件存在" (5认同)
  • @TrevorBoydSmith,python3.6 报告目标存在错误,但它在 Python 3.9.7 中工作正常。 (4认同)
  • 您不需要指定完整路径。如果文件名包含在目标路径(相对或绝对)中,shutil 将覆盖。 (2认同)

小智 5

我通过在移动命令中为源和目标提供完整路径来覆盖它......记得为 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.
Run Code Online (Sandbox Code Playgroud)