2

我想自动化将文件(在其目标文件夹中)复制到位于计算机不同目录中的相应源文件夹(与源文件夹结构相同)的过程......

我尝试使用python的shutil.copytree,但这会将所有目标文件夹复制到源文件夹中,并且 Python 文档说“由 dst 命名的目标目录必须不存在”(在我的情况下,这违反了规则)。所以我想做的就是只将目标文件复制到相应的文件夹中,这样源文件和目标文件最终会留在同一个文件夹中......是否可以使用python来做?

在这里,我附上了一个截图,以进一步解释我的意思。

非常感谢你的帮助!同时,我也会尝试做更多的研究!

在此处输入图像描述

4

2 回答 2

2

shutil.copytree这是不创建目录的修改版本(删除os.makedirs调用)。

import os
from shutil import Error, WindowsError, copy2, copystat

def copytree(src, dst, symlinks=False, ignore=None):
    names = os.listdir(src)
    if ignore is not None:
        ignored_names = ignore(src, names)
    else:
        ignored_names = set()

    # os.makedirs(dst)
    errors = []
    for name in names:
        if name in ignored_names:
            continue
        srcname = os.path.join(src, name)
        dstname = os.path.join(dst, name)
        try:
            if symlinks and os.path.islink(srcname):
                linkto = os.readlink(srcname)
                os.symlink(linkto, dstname)
            elif os.path.isdir(srcname):
                copytree(srcname, dstname, symlinks, ignore)
            else:
                # Will raise a SpecialFileError for unsupported file types
                copy2(srcname, dstname)
        # catch the Error from the recursive copytree so that we can
        # continue with other files
        except Error, err:
            errors.extend(err.args[0])
        except EnvironmentError, why:
            errors.append((srcname, dstname, str(why)))
    try:
        copystat(src, dst)
    except OSError, why:
        if WindowsError is not None and isinstance(why, WindowsError):
            # Copying file access times may fail on Windows
            pass
        else:
            errors.append((src, dst, str(why)))
    if errors:
        raise Error, errors

使用mock(或unittest.mock在 Python 3.x 中),您可以os.makedirs通过替换os.makedirs为 Mock 对象来临时禁用(请参阅unittest.mock.patch):

from shutil import copytree
import mock  # import unittest.mock as mock   in Python 3.x

with mock.patch('os.makedirs'):
    copytree('PlaceB', 'PlaceA')
于 2015-12-05T05:42:51.613 回答
0

我刚刚找到了一个相当简单的方法来实现它。

我们可以使用同上命令将 2 个文件夹合并在一起。

ditto PlaceB PlaceA

于 2015-12-15T01:12:55.153 回答