【问题标题】:copytree(), What are parameters symlink and ignore for?copytree(),什么是参数符号链接和忽略?
【发布时间】:2019-11-15 17:00:58
【问题描述】:

我对 Python 很陌生,所以请多多包涵。 我正在寻找写一些东西来将文件从一个目录复制到另一个目录。 我找到了以下问题和答案:Here

在那里,我找到了这个答案:

def copytree(src, dst, symlinks=False, ignore=None):
for item in os.listdir(src):
    s = os.path.join(src, item)
    d = os.path.join(dst, item)
    if os.path.isdir(s):
        shutil.copytree(s, d, symlinks, ignore)
    else:
        shutil.copy2(s, d)

后来为了解决一些问题而添加的:

#!/usr/bin/python
import os
import shutil
import stat
def copytree(src, dst, symlinks = False, ignore = None):
  if not os.path.exists(dst):
    os.makedirs(dst)
    shutil.copystat(src, dst)
  lst = os.listdir(src)
  if ignore:
    excl = ignore(src, lst)
    lst = [x for x in lst if x not in excl]
  for item in lst:
    s = os.path.join(src, item)
    d = os.path.join(dst, item)
    if symlinks and os.path.islink(s):
      if os.path.lexists(d):
        os.remove(d)
      os.symlink(os.readlink(s), d)
      try:
        st = os.lstat(s)
        mode = stat.S_IMODE(st.st_mode)
        os.lchmod(d, mode)
      except:
        pass # lchmod not available
    elif os.path.isdir(s):
      copytree(s, d, symlinks, ignore)
    else:
      shutil.copy2(s, d)

我知道当目标目录已经存在并且这些修订旨在处理它时,shutil.copytree() 会出现问题。

我的问题是关于我看到的符号链接和忽略参数,但不了解它们的作用以及它如何解决问题。

我能够找到下面的定义,这让我大吃一惊:

symlinks(可选):此参数接受 True 或 False,具体取决于 原始链接或链接链接的元数据将在其上 复制到新树。

ignore (optional) :如果给出了ignore,它必须是一个可调用的 将接收正在访问的目录作为其参数 copytree() 及其内容列表,由 os.listdir() 返回。

【问题讨论】:

    标签: python directory symlink copytree


    【解决方案1】:

    这可能不是您想要的,但如果您可以的话,简单地使用您的操作系统的复制功能会更容易编码和理解。这可以通过带有 os 库的 python 来完成。

    def copytree(src,dst):
        os.system("cp -r "+src+" "+dst)
    

    此示例假定您使用的是 linux,但它适用于任何操作系统,您只需为本地复制命令切换 'cp -r' 即可。

    【讨论】:

    • 我以为我在某处读到这不会跨不同驱动器复制。我的意图是将某些东西从个人电脑转移到闪存驱动器。另外,我假设“”是用粘贴命令填充的,或者“”只是这样做。
    • 只要你在这种情况下使用完整的文件路径,包括挂载点,我看不出它为什么不能工作,因为这就是操作系统复制东西的方式。例如:f:\Desktop\backupme.doc d:\backup
    • 对不起,我只回答了第一部分“”是这样当 python 构造字符串时,文件路径之间有一个空格,正如 cp 所期望的那样。对于 Windows,我相信你会想要使用 "xcopy "+src+" "+dst
    • 我最终尝试使用您的方式,但这一次只复制一个文件,并没有实现上述代码的功能,即复制整个文件夹或目录。跨度>
    • 非常感谢您在这方面的坚持。这非常有效!以下是我最终使用的内容,每次它实际看到要传输的文件时都会提示我:'code' def copytree(directory1, directory2): os.system("xcopy /p /s %s %s" % (directory1,目录2)) '代码'
    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2010-09-16
    • 1970-01-01
    相关资源
    最近更新 更多