Copy file or directories recursively in Python
python似乎有复制文件的功能(如shutil.copy)和复制目录的功能(如shutil.copytree),但我没有找到同时处理这两者的功能。当然,检查您是想复制一个文件还是一个目录是很简单的,但这似乎是一个奇怪的遗漏。
是否真的没有像unix cp -r命令那样工作的标准函数,即支持目录、文件和递归复制?在Python中,解决这个问题最优雅的方法是什么?
- 是的,这真是一团糟。其中一个地方,通过尝试反映底层系统调用,python使可见接口变得更糟。虽然在复制文件和复制树之间切换并不困难,但这不应该是必需的。也许在python bug tracker上提交一个增强请求,允许copytree复制一个文件?
我建议您首先调用shutil.copytree,如果抛出异常,则使用shutil.copy重试。
1 2 3 4 5 6 7 8 9
| import shutil, errno
def copyanything(src, dst):
try:
shutil.copytree(src, dst)
except OSError as exc: # python >2.5
if exc.errno == errno.ENOTDIR:
shutil.copy(src, dst)
else: raise |
- 我认为这将是一个更清洁和检查是否是一个目录使用钢骨混凝土(SRC)而os.path.isdir捕捉到异常样本。或有一些特殊原因,应该使用异常而不是在这里吗?
- 1)E(AFP(在Python的世界,因为它更容易比问宽恕lbyl(许可)是首选的外观到之前,你的飞跃。我可以提供你的联系吗,如果它在你的声音。2)间接制约图书馆功能已经为那个位置,那么为什么replicate检查?3)不停的shutil.copytree函数从两个案例中,改善和管理的未来。4)异常处理程序是在Python中不方便;例如在A stopiteration迭代停止由异常改变。
- 好的,这需要处理例外案例6线,该线把while型4。不多,但它在加上结束。所以,你可能会说,有一天我会很好的支持文件copytree为好。但它是不可能告诉这将是什么样的实现。也许在一些环境下抛出异常复制的作品在哪里?我会在这案例代码只是因为突然停止工作的增值功能。但你这可能是正确的,异常处理程序是在Python的义例--漂亮的东西,我觉得这非常恼人的,但它可能是因为我从来没有得到它的人
- 因为你提到它,例外检查代码可以写在上面的4线(就像你或文件检查代码可以写在2)。在任何异常的病例,是部分的"标准"(在Python和原谅我,如果我要为你可能有通孔patronizing)被用于他们的Python(或滴!:)。
- 有一个明确的工作目标是异常的优势:本案例是完全可能的(虽然不太可能,1)型变化之间的检查和调用正确的函数。
- 我不说这是不是从一shutil.copytree原子操作,所以它可能是安静类型的变化而copytree挤兑。
- 这只是在我的实现细节/错误。在未来的版本(可能是固定在一路不中断的代码,所以我给了以上的论点,不适用于在本案例)
- 在我个人的意见,除了增加的核心功能是在洗澡的做法,不物,你使用的是语言。它使功能到一个地方,在很多开发商不会搜索。继续,如果你不写评论,但经验丰富的Python开发者A也不真的明白这是什么"的目的。如果你需要添加一个搜索琐碎的事我一样在这里,什么是错在你的编码风格。最后,在if / else result想写作更容易阅读的代码中使用。
- 在我的Windows机器和8.1 Python 2.7,试图在一个不同的文件copytree错误:errno.EINVALRAISE。所以这不是对E(AFP的方法的鲁棒性的变化看似琐碎的错误数。
要添加Tzot和GNS答案,这里有一种递归复制文件和文件夹的替代方法。(Python 3。x)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import os, shutil
root_src_dir = r'C:\MyMusic' #Path/Location of the source directory
root_dst_dir = 'D:MusicBackUp' #Path to the destination folder
for src_dir, dirs, files in os.walk(root_src_dir):
dst_dir = src_dir.replace(root_src_dir, root_dst_dir, 1)
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
for file_ in files:
src_file = os.path.join(src_dir, file_)
dst_file = os.path.join(dst_dir, file_)
if os.path.exists(dst_file):
os.remove(dst_file)
shutil.copy(src_file, dst_dir) |
如果这是你第一次,你不知道如何递归地复制文件和文件夹,我希望这有帮助。
shutil.copy和shutil.copy2正在复制文件。
shutil.copytree复制一个包含所有文件和所有子文件夹的文件夹。shutil.copytree使用shutil.copy2复制文件。
所以你说的与cp -r类似的是shutil.copytree,因为cp -r针对并复制一个文件夹及其文件/子文件夹,如shutil.copytree。没有-rcp拷贝文件,如shutil.copy和shutil.copy2做。
- 我不认为你的理解问题。shutil.copytree('C:\myfile.txt', 'C:\otherfile')尝试。它不工作。这是关于"手术问什么……7年前。
- 当然,它不工作。样的CP不与文件夹。你需要一个特殊的选择。复制和copytree是最好的方式来处理复制。如果目标文件copytree可以和它会很容易让错误。你必须知道你的目标是与Linux和Python。这是硬的。该加别人看到它在这里,但这个问题和答案不能回复到抗蚀剂。在优雅的方式是知道你想做的人,没有任何通用的复制和控制。
unix cp不支持目录和文件:
1 2
| betelgeuse:tmp james$ cp source/ dest/
cp: source/ is a directory (not copied). |
要让cp复制一个目录,您必须使用"-r"标志手动告诉cp它是一个目录。
这里有一些断开连接,但是当传递一个文件名时-cp -r,因为源文件很乐意只复制单个文件;copytree不会。
- docs.python.org /图书馆/ shutil.html包括位置码(处理)这copytree demonstrates普通文件,目录的符号链接,和。
- 这个问题不好回答的地址。它应该是a comment,需要的答案。
我想你要找的是复制树
python shutil.copytree方法一团糟。我做了一个正确的工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| def copydirectorykut(src, dst):
os.chdir(dst)
list=os.listdir(src)
nom= src+'.txt'
fitx= open(nom, 'w')
for item in list:
fitx.write("%s
" % item)
fitx.close()
f = open(nom,'r')
for line in f.readlines():
if"." in line:
shutil.copy(src+'/'+line[:-1],dst+'/'+line[:-1])
else:
if not os.path.exists(dst+'/'+line[:-1]):
os.makedirs(dst+'/'+line[:-1])
copydirectorykut(src+'/'+line[:-1],dst+'/'+line[:-1])
copydirectorykut(src+'/'+line[:-1],dst+'/'+line[:-1])
f.close()
os.remove(nom)
os.chdir('..') |
- 本代码是一个很好的工作的个人文件检查(检查overwriting Issue),但不工作的二进制文件搜索的"拉链"。为什么需要使用简单的Python文件复制而不是线由线的读/写吗?