在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.copy
和shutil.copy2
正在复制文件。
shutil.copytree
复制一个包含所有文件和所有子文件夹的文件夹。 shutil.copytree
使用shutil.copy2
来复制文件。
所以模拟cp -r
你说的是shutil.copytree
因为cp -r
目标是复制一个文件夹及其文件/子文件夹,比如shutil.copytree
。 没有-r
cp
拷贝文件就像shutil.copy
和shutil.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('..')