【问题标题】:How can I copy files in Python while keeping their directory structure?如何在 Python 中复制文件同时保持其目录结构?
【发布时间】:2012-08-17 02:57:14
【问题描述】:

我有一个包含许多子目录的目录列表。

例如C:\home\test\myfiles\myfile.txt

我想将此复制到我的X: 驱动器。如果X: 驱动器仅包含X:\\home,我如何复制myfile.txt

我以为shutil 会在复制文件时创建必要的目录,但我错了,我不确定该使用什么。

换个说法……

我想将C:\\home\\test\\myfiles\\myfile.txt 复制到X:\\home\\test\\myfiles\\myfile.txt,但X:\\home\\test\\myfiles 不存在。

谢谢!

【问题讨论】:

    标签: python copy directory file-copying


    【解决方案1】:

    你需要在shutil.copytree旁边使用os.makedirs

    【讨论】:

    • shutil.copytree 就足够了,不是吗?
    • @IamChuckB -- 不。用户希望驱动器 X 上的绝对路径与驱动器 C 上的绝对路径相同。所以,如果我想使用 shutil 复制目录 C:/this/is/a/directory ,我需要确保X:/this/is/a 存在(这是os.makedirs 的来源)。
    • shutil.copytree 如果有问题的文件夹已经存在 afaik 会出错?我只使用过一次,无法访问我写的内容,但我很确定 copytree 会为您设置目录结构
    • @IamChuckB -- os.makedirs 不会创建被复制的目录。 os.makedirs 是创建中间目录,直到要复制的目录。
    • 您对需要的 os.makedirs 是正确的。我发布了我的解决方案。
    【解决方案2】:

    所以这就是我最终要做的。 mgilson 是对的,我需要使用 makedirs,但我不需要复制树。

    for filepath in myfilelist:
        try:
            with open(filepath) as f: pass
        except IOError as e:
            splitlocaldir = filepath.split(os.sep)
            splitlocaldir.remove(splitlocaldir[-1:][0])
            localdir = ""
            for item in splitlocaldir:
                localdir += item + os.sep
            if not os.path.exists(localdir):
                os.makedirs(localdir)
            shutil.copyfile(sourcefile, filepath)
    

    这会将目录分成一个列表,这样我就可以提取文件名,将路径变成一个目录。

    然后我将它缝合在一起并检查目录是否存在。

    如果不是,我使用 os.makedirs 创建目录。

    然后我可以使用我原来的完整路径并在目录结构存在的情况下复制文件。

    【讨论】:

    • 一些评论。 splitlocaldir = filepath.split(os.sep) 可以是 os.path.split(filepath)splitlocaldir.remove(splitlocaldir[-1:][0]) 和所有的逃跑一样令人困惑。相反,只需使用splitlocaldir = splitlocaldir[:-1](如果我没看错的话)。您也可以通过os.path.join(splitlocaldir) 构建localdir。当然,您可以通过 localdir = os.path.dirname(filepath) 来避免所有这些
    猜你喜欢
    • 2017-04-07
    • 2016-07-08
    • 1970-01-01
    • 2018-11-01
    • 2013-03-16
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    相关资源
    最近更新 更多