递归文件复制到子目录中

时间:2010-12-01 12:47:06

标签: python

我需要将所有文件和文件夹复制到当前文件夹中的子目录。最好的方法是什么?我尝试了以下代码段,但如果目标目录已经存在则失败,因为它失败了。

def copy(d=os.path.curdir):
    dest = "t"
    for i in os.listdir(d):
        if os.path.isdir(i):
            shutil.copytree(i, dest)
        else:
            shutil.copy(i, dest)

我觉得可以更好,更轻松地完成同样的任务。我该怎么做?

5 个答案:

答案 0 :(得分:2)

我永远不会在python上做到这一点,但我想到了以下解决方案。它看起来并不简单,但它应该可以工作并且可以简化(没有检查,抱歉,现在无法访问计算机):

def copyDirectoryTree(directory, destination, preserveSymlinks=True):
  for entry in os.listdir(directory):
    entryPath = os.path.join(directory, entry)
    if os.path.isdir(entryPath):
      entrydest = os.path.join(destination, entry)
      if os.path.exists(entrydest):
        if not os.path.isdir(entrydest):
          raise IOError("Failed to copy thee, the destination for the `" + entryPath + "' directory exists and is not a directory")
        copyDirectoryTree(entrypath, entrydest, preserveSymlinks)
      else:
        shutil.copytree(entrypath, entrydest, preserveSymlinks)
    else: #symlinks and files
      if preserveSymlinks:
        shutil.copy(entryPath, directory)
      else:
        shutil.copy(os.path.realpath(entryPath), directory)

答案 1 :(得分:1)

请参阅http://docs.python.org/library/shutil.html中的代码,然后稍微调整一下(例如,尝试:围绕os.makedirs(dst))。

答案 2 :(得分:1)

延长mamnun的答案,

如果你想直接调用os,我建议使用cp -r,因为你似乎想要一个目录的递归副本。

答案 3 :(得分:0)

你真的需要使用python吗?因为shutil函数无法复制所有文件元数据和组权限。为什么不尝试内置操作系统命令,如linux中的cp和Windows中的xcopy

您甚至可以尝试从python

运行这些命令
import os

os.system("cp file1 file2")

希望这有帮助。

答案 4 :(得分:0)

这是我的python的递归复制方法的版本,似乎工作:)

def copy_all(fr, to, overwrite=True):
  fr = os.path.normpath(fr)
  to = os.path.normpath(to)

  if os.path.isdir(fr):
    if (not os.path.exists(to + os.path.basename(fr)) and not
    os.path.basename(fr) == os.path.basename(to)):
      to += "/" + os.path.basename(fr)
      mkdirs(to)
    for file in os.listdir(fr):
      copy_all(fr + "/" + file, to + "/")
  else: #symlink or file
    dest = to
    if os.path.isdir(to):
      dest += "/"
      dest += os.path.basename(fr)

    if overwrite and (os.path.exists(dest) or os.path.islink(dest)
      rm(dest)

    if os.path.isfile(fr):
      shutil.copy2(fr, dest)
    else: #has to be a symlink
      os.symlink(os.readlink(fr), dest)  


def mkdirs(path):                                                 
  if not os.path.isdir(path):
    os.makedirs(path)


def rm(path):                                                     
  if os.path.isfile(path) or os.path.islink(path):
    os.remove(path)
  elif os.path.isdir(path):
    for file in os.listdir(path):
      fullpath = path+"/"+file
      os.rmdir(fullpath)