在Python中recursion复制文件或目录

Python似乎有复制文件(例如shutil.copy )和复制目录(例如shutil.copytree )function的function,但我还没有find任何处理两者的function。 当然,检查你是否想复制一个文件或一个目录是微不足道的,但是这似乎是一个奇怪的遗漏。

是否真的没有标准function,像UNIX命令,即支持目录和文件和recursion复制的副本? 在Python中解决这个问题的最优雅的方法是什么?

我build议你先调用shutil.copytree ,如果抛出一个exception,然后用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 

Unix的cp不支持目录和文件:

 betelgeuse:tmp james$ cp source/ dest/ cp: source/ is a directory (not copied). 

要使cp复制一个目录,你必须通过使用'-r'标志来手动告诉cp它是一个目录。

这里有一些断开,虽然 – cp -r当传递一个文件名作为源将高兴地复制只有一个文件; copytree不会。

要添加Tzot和Gns的答案,这是recursion复制文件和文件夹的另一种方法。 (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) 

如果这是你第一次,你不知道如何recursion复制文件和文件夹,我希望这有助于。

shutil.copyshutil.copy2正在复制文件。

shutil.copytree复制一个包含所有文件和所有子文件夹的文件夹。 shutil.copytree使用shutil.copy2来复制文件。

所以模拟cp -r你说的是shutil.copytree因为cp -r目标是复制一个文件夹及其文件/子文件夹,比如shutil.copytree 。 没有-r cp拷贝文件就像shutil.copyshutil.copy2一样。

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('..')