python实现文件夹目录拷贝

时间:2022-11-13 21:38:52
需求:复制1个10多个G的文件夹(另外机器共享过来的文件夹,里面含有约10w个文件)到本机一个目录(另外那台机器磁盘满了的原因) 

使用windows的文件夹复制,发现经常在复制一部分文件后,因某些莫名其妙的原因被中断(提示某个文件复制失败,网络被断开,可能是由于网络不稳定),然后就要从头再来,搞了几个小时还没有搞完,烦死 

就想到用python写个脚本来做这个事情:文件已经存在并且大小一致时不重复复制加快处理速度 

代码如下 
Python代码  python实现文件夹目录拷贝
  1. #! /usr/bin/env python  
  2. # -*- coding: utf-8 -*-  
  3. #@author zcwang3@gmail.com  
  4. #@version 2010-09-25 14:57  
  5.   
  6. import os  
  7. import time  
  8.   
  9. sourceDir = r"\\192.168.3.250\mmtimages"  
  10. targetDir = r"D:\mmtimages"  
  11. copyFileCounts = 0  
  12.   
  13. def copyFiles(sourceDir, targetDir):  
  14.     global copyFileCounts  
  15.     print sourceDir  
  16.     print u"%s 当前处理文件夹%s已处理%s 个文件" %(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())), sourceDir,copyFileCounts)  
  17.     for f in os.listdir(sourceDir):  
  18.         sourceF = os.path.join(sourceDir, f)  
  19.         targetF = os.path.join(targetDir, f)  
  20.                 
  21.         if os.path.isfile(sourceF):  
  22.             #创建目录  
  23.             if not os.path.exists(targetDir):  
  24.                 os.makedirs(targetDir)  
  25.             copyFileCounts += 1  
  26.               
  27.             #文件不存在,或者存在但是大小不同,覆盖  
  28.             if not os.path.exists(targetF) or (os.path.exists(targetF) and (os.path.getsize(targetF) != os.path.getsize(sourceF))):  
  29.                 #2进制文件  
  30.                 open(targetF, "wb").write(open(sourceF, "rb").read())  
  31.                 print u"%s %s 复制完毕" %(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())), targetF)  
  32.             else:  
  33.                 print u"%s %s 已存在,不重复复制" %(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())), targetF)  
  34.           
  35.         if os.path.isdir(sourceF):  
  36.             copyFiles(sourceF, targetF)  
  37.           
  38. if __name__ == "__main__":  
  39.     try:  
  40.         import psyco  
  41.         psyco.profile()  
  42.     except ImportError:  
  43.         pass  
  44.     copyFiles(sourceDir,targetDir)