python递归实现文件复制_在python中递归复制文件或目录

python似乎有复制文件的功能(如shutil.copy)和复制目录的功能(如shutil.copytree),但我没有找到同时处理这两者的功能。当然,检查您是想复制一个文件还是一个目录是很简单的,但这似乎是一个奇怪的遗漏。

是否真的没有像unix cp -r命令那样工作的标准函数,即支持目录、文件和递归复制?在Python中,解决这个问题最优雅的方法是什么?

是的,这真是一团糟。其中一个地方,通过尝试反映底层系统调用,python使可见接口变得更糟。虽然在复制文件和复制树之间切换并不困难,但这不应该是必需的。也许在python bug tracker上提交一个增强请求,允许copytree复制一个文件?

我建议您首先调用shutil.copytree,如果抛出异常,则使用shutil.copy重试。

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)

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不支持目录和文件:

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方法一团糟。我做了一个正确的工作:

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文件复制而不是线由线的读/写吗?

你可能感兴趣的:(python递归实现文件复制)