Python - 移动和覆盖文件和文件夹

新手上路,请多包涵

我有一个目录“Dst 目录”,其中包含文件和文件夹,我有一个“src 目录”,其中也包含文件和文件夹。我想要做的是将“src 目录”的内容移动到“Dst 目录”并覆盖任何同名的文件。因此,例如“Src Directory\file.txt”需要移动到“Dst Directory\”并覆盖现有的 file.txt。这同样适用于某些文件夹,移动文件夹并将内容与“dst 目录”中的同一文件夹合并

我目前正在使用 shutil.move 将 src 的内容移动到 dst 但如果文件已经存在并且它不会合并文件夹,它就不会这样做;它只会将文件夹放在现有文件夹中。

更新:为了让事情更清楚一点,我正在做的是将存档解压缩到 Dst 目录,然后将 Src 目录的内容移到那里并重新压缩,从而有效地更新 zip 存档中的文件。这将重复添加新文件或文件的新版本等,这就是它需要覆盖和合并的原因

已解决:我通过使用 distutils.dir_util.copy_tree(src, dst) 解决了我的问题,这将文件夹和文件从 src 目录复制到 dst 目录,并在需要的地方覆盖/合并。

原文由 Artharos 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

使用 copy() 代替,它愿意覆盖目标文件。如果您随后希望第一棵树消失,只需 rmtree() 完成迭代后将其分开。

http://docs.python.org/library/shutil.html#shutil.copy

http://docs.python.org/library/shutil.html#shutil.rmtree

更新:

在源代码树上执行 os.walk() 。对于每个目录,检查它是否存在于目标端,以及 os.makedirs() 如果它丢失了。对于每个文件,只需 shutil.copy() 文件将被创建或覆盖,以适当的为准。

原文由 Brandon Rhodes 发布,翻译遵循 CC BY-SA 3.0 许可协议

这将遍历源目录,创建目标目录中尚不存在的任何目录,并将文件从源目录移动到目标目录:

 import os
import shutil

root_src_dir = 'Src Directory\\'
root_dst_dir = 'Dst Directory\\'

for src_dir, dirs, files in os.walk(root_src_dir):
    dst_dir = src_dir.replace(root_src_dir, root_dst_dir, 1)
    if not os.path.exists(dst_dir):
        os.makedirs(dst_dir)
    for file_ in files:
        src_file = os.path.join(src_dir, file_)
        dst_file = os.path.join(dst_dir, file_)
        if os.path.exists(dst_file):
            # in case of the src and dst are the same file
            if os.path.samefile(src_file, dst_file):
                continue
            os.remove(dst_file)
        shutil.move(src_file, dst_dir)

在被相应的源文件替换之前,将首先删除任何预先存在的文件(通过 os.remove )。目标中已存在但源中不存在的任何文件或目录将保持不变。

原文由 Ray 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题