我希望复制整个目录及其文件,但还要打印正在复制的每个文件名。
我使用了一个简单的调用cp -rf dir dest
withos.system
但我不能单独打印每个文件名,因为很明显。
然后我考虑通过递归调用 ls 来列出 eash 目录文件os.system
,保存整个字符串,将它们拆分为一个数组,并实现一个 for 循环来运行 os.system("cp" file1 + "des/") 并打印文件名,但看起来工作量很大。
有更好的想法来实现这一点吗?
我希望复制整个目录及其文件,但还要打印正在复制的每个文件名。
我使用了一个简单的调用cp -rf dir dest
withos.system
但我不能单独打印每个文件名,因为很明显。
然后我考虑通过递归调用 ls 来列出 eash 目录文件os.system
,保存整个字符串,将它们拆分为一个数组,并实现一个 for 循环来运行 os.system("cp" file1 + "des/") 并打印文件名,但看起来工作量很大。
有更好的想法来实现这一点吗?
您可以使用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)