Python似乎有用于复制文件的函数(例如shutil.copy
)和用于复制目录的函数(例如shutil.copytree
),但我没有找到处理两者的函数。当然,检查你想要复制的是文件还是目录很简单,但这似乎是一个奇怪的遗漏。
真的没有标准函数可以像Unix的cp -r
命令一样工作,即支持目录和文件,并进行递归复制吗?在Python中解决这个问题最优雅的方法是什么?
Python似乎有用于复制文件的函数(例如shutil.copy
)和用于复制目录的函数(例如shutil.copytree
),但我没有找到处理两者的函数。当然,检查你想要复制的是文件还是目录很简单,但这似乎是一个奇怪的遗漏。
真的没有标准函数可以像Unix的cp -r
命令一样工作,即支持目录和文件,并进行递归复制吗?在Python中解决这个问题最优雅的方法是什么?
我建议您首先调用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 in (errno.ENOTDIR, errno.EINVAL):
shutil.copy(src, dst)
else: raise
shutil.copytree
函数未来可以改进和管理两种情况,没有任何限制。4) 在Python中,异常并不那么特殊;例如迭代通过引发 StopIteration 异常停止。在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
一样。 如果没有-r
,那么cp
会像shutil.copy
和shutil.copy2
一样只复制文件。
shutil.copytree('C:\myfile.txt', 'C:\otherfile')
。它不起作用。这就是OP在7年前所问的问题... - Jean-François Corbettdistutils.dir_util
本地包的copy_tree
函数: copy_tree。distutils.dir_util。import distutils.dir_util
from_dir = "foo/bar"
to_dir = "truc/machin"
distutils.dir_util.copy_tree(from_dir, to_dir)
from_dir = files.txt
?请看问题。src
和 dst
必须是目录名。如果 src
不是目录,则引发 DistutilsFileError
。 - Muhammad YasirroniUnix的cp
命令不支持同时复制目录和文件:
betelgeuse:tmp james$ cp source/ dest/
cp: source/ is a directory (not copied).
cp -r
会愉快地只复制单个文件; 但copytree不会。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\n" % 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('..')
copytree
复制单个文件? - bobince