1

我希望复制整个目录及其文件,但还要打印正在复制的每个文件名。

我使用了一个简单的调用cp -rf dir destwithos.system但我不能单独打印每个文件名,因为很明显。

然后我考虑通过递归调用 ls 来列出 eash 目录文件os.system,保存整个字符串,将它们拆分为一个数组,并实现一个 for 循环来运行 os.system("cp" file1 + "des/") 并打印文件名,但看起来工作量很大。

有更好的想法来实现这一点吗?

4

1 回答 1

4

您可以使用os.walk获取整个目录列表并使用该列表迭代地复制所有文件。就像是

file_paths = [os.path.join(root, f) for root, _, files in os.walk('.') for f in files]
for path in file_paths:
    print path
    shutil.copy(path, target)

或者根据MatthewFranglen你的评论你可以这样做shutil.copytree(src, dst)。这也将允许您忽略某些事情,但您需要定义一个函数来执行此操作,而不是在列表推导中使用 if。

# ignore all .DS_Store and *.txt files
file_paths = [os.path.join(root, f) for root, _, files in os.walk('.') for f in files if (f != '.DS_Store') or f.endswith('.txt'))]

相比

from shutil import copytree, ignore_patterns
ignore_func = ignore_patterns('.DS_Store', '*.txt')  # ignore .DS_Store and *.txt files
copytree('/path/to/dir/', '/other/dir', ignore=ignore_func)
于 2012-09-24T19:27:21.747 回答