首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中递归复制文件或目录

在Python中递归复制文件或目录
EN

Stack Overflow用户
提问于 2010-01-03 18:06:42
回答 6查看 182.7K关注 0票数 135

Python似乎有复制文件的函数(例如shutil.copy)和复制目录的函数(例如shutil.copytree),但我还没有找到同时处理这两种功能的函数。当然,检查您是否想要复制文件或目录是微不足道的,但这似乎是一个奇怪的遗漏。

是否真的没有像unix cp -r命令那样工作的标准函数,即同时支持目录和文件并递归复制?在Python中解决这个问题最优雅的方法是什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-01-03 20:35:26

我建议您首先调用shutil.copytree,如果抛出异常,则使用shutil.copy重试。

代码语言:javascript
复制
import shutil, errno

def copyanything(src, dst):
    try:
        shutil.copytree(src, dst)
    except OSError as exc: # python >2.5
        if exc.errno in (errno.ENOTDIR, errno.EINVAL):
            shutil.copy(src, dst)
        else: raise
票数 163
EN

Stack Overflow用户

发布于 2017-03-04 19:37:59

要添加Tzot'sgns答案,这里有一种递归复制文件和文件夹的替代方法。(Python 3.X)

代码语言:javascript
复制
import os, shutil

root_src_dir = r'C:\MyMusic'    #Path/Location of the source directory
root_dst_dir = 'D:MusicBackUp'  #Path to the destination folder

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):
            os.remove(dst_file)
        shutil.copy(src_file, dst_dir)

如果这是你的第一次,并且你不知道如何递归地复制文件和文件夹,我希望这对你有帮助。

票数 12
EN

Stack Overflow用户

发布于 2017-02-15 20:37:01

shutil.copyshutil.copy2正在复制文件。

shutil.copytree会复制一个包含所有文件和所有子文件夹的文件夹。shutil.copytree正在使用shutil.copy2复制文件。

因此,您所说的类似于cp -rshutil.copytree,因为cp -r定位并复制一个文件夹及其文件/子文件夹,如shutil.copytree。在没有-r的情况下,cp会像shutil.copyshutil.copy2一样复制文件。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1994488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档