如何使用 python 覆盖复制完整目录及其内容?
Posted
技术标签:
【中文标题】如何使用 python 覆盖复制完整目录及其内容?【英文标题】:How to use python to copy full directory and its contents overwrittenly? 【发布时间】:2019-04-04 03:35:58 【问题描述】:文件结构如下:
/email1/垃圾邮件
/email2/垃圾邮件
/email3/垃圾邮件 ...
现在,将所有“垃圾邮件”目录下的所有文件复制到一个名为 /email_data/spam 的新目录
我尝试使用shutil.copytree,但它只复制第一个目录(copytree要求目标必须不存在)。
然后我尝试了distutils.dir_util.copy_tree,它可以工作,但我不知道为什么每次复制后都会出现一些重复的文件。 (例如 spam_email.txt、spam_email_1.txt)。应该有15045个文件,但是代码拷贝16545其中1500多...
【问题讨论】:
是否有需要 Python 的具体原因?rsync
等其他实用程序可能更适合。
是的,我必须使用 python 来做到这一点。
How do I copy an entire directory of files into an existing directory using Python?的可能重复
【参考方案1】:
最后我发现rsync非常好用,就像metatoaster说的,用os.system(command)就行了。
其实distutils.dir_util.copy_tree也可以,copy没有重复错误,源目录本身有重复文件...
【讨论】:
【参考方案2】:你可以os.walk
询问根是否是垃圾邮件,然后才复制shutil
的文件。
也许不是最有效的方式,但相当合理。
另一种方法是使用os.system
,例如:
find . --path *spam | xargs -I cp -r ./spam
尚未验证。
【讨论】:
这没有为 OP 的问题提供有意义的答案。【参考方案3】:我建议采用shutil.copytree()
和shutil.copy()
方法,如here 与rsync
结合使用,请参阅this
这是一个未经测试的完整复制粘贴示例:
#!/usr/bin/env python3
import fileinput, os, fnmatch, re, io, errno, shutil
import ignore_patterns from shutil
errorMsgSrc = "Source File does exists, continuing using rsync ..."
def CopyFolder(src, dest):
try:
if not os.path.exists(dest):
shutil.copytree(src, dest, ignore= ignore_patterns('*.json', '*.css', '*.scss', '*.js', '*.jpg', '*.png', '*.xcf'))
print(errorMsgSrc.rstrip())
if os.path.exists(dest):
# Now choose your weapons for overwriting
# maybe you wanna change working directory with e.g., os.chdir(dir)
# -arv (archive, recursively and verbose)
# make sure you got the slashes correct here
assert os.system("rsync -arv " + src + " " + dest), "ERROR rsync step failed"
# either delete the source file or use rsync with os.system
except OSError as e:
# If the error was caused because the source wasn't a directory
if e.errno == errno.ENOTDIR:
shutil.copy(src, dest)
else:
print('Directory not copied. Error: %s' % e)
if __name__ == '__main__':
CopyFolder("source/", "~/home/usr/Desktop/")
【讨论】:
以上是关于如何使用 python 覆盖复制完整目录及其内容?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 cgi python 脚本在浏览器中显示 pdf 文件内容及其全名?