Answers:
建议您先致电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
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年前问的问题。
Unix cp不“支持目录和文件”:
betelgeuse:tmp james$ cp source/ dest/
cp: source/ is a directory (not copied).
要使cp复制目录,必须使用'-r'标志手动告诉cp它是目录。
但是这里有些脱节- cp -r当传递文件名时,源将很高兴地仅复制单个文件。复制树不会。
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复制单个文件?