论坛首页 编程语言技术论坛

python文件夹复制

浏览 6195 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-09-25   最后修改:2010-09-29
需求:复制1个10多个G的文件夹(另外机器共享过来的文件夹,里面含有约10w个文件)到本机一个目录(另外那台机器磁盘满了的原因)

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

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

代码如下
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#@author zcwang3@gmail.com
#@version 2010-09-25 14:57

import os
import time

sourceDir = r"\\192.168.3.250\mmtimages"
targetDir = r"D:\mmtimages"
copyFileCounts = 0

def copyFiles(sourceDir, targetDir):
    global copyFileCounts
    print sourceDir
    print u"%s 当前处理文件夹%s已处理%s 个文件" %(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())), sourceDir,copyFileCounts)
    for f in os.listdir(sourceDir):
        sourceF = os.path.join(sourceDir, f)
        targetF = os.path.join(targetDir, f)
              
        if os.path.isfile(sourceF):
            #创建目录
            if not os.path.exists(targetDir):
                os.makedirs(targetDir)
            copyFileCounts += 1
            
            #文件不存在,或者存在但是大小不同,覆盖
            if not os.path.exists(targetF) or (os.path.exists(targetF) and (os.path.getsize(targetF) != os.path.getsize(sourceF))):
                #2进制文件
                open(targetF, "wb").write(open(sourceF, "rb").read())
                print u"%s %s 复制完毕" %(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())), targetF)
            else:
                print u"%s %s 已存在,不重复复制" %(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())), targetF)
        
        if os.path.isdir(sourceF):
            copyFiles(sourceF, targetF)
        
if __name__ == "__main__":
    try:
        import psyco
        psyco.profile()
    except ImportError:
        pass
    copyFiles(sourceDir,targetDir)
   发表时间:2010-09-26  
distutils.dir_util.copy_tree does what you want.

Copy an entire directory tree src to a new location dst. Both src and dst must be directory names. If src is not a directory, raise DistutilsFileError. If dst does not exist, it is created with mkpath(). The end result of the copy is that every file in src is copied to dst, and directories under src are recursively copied to dst. Return the list of files that were copied or might have been copied, using their output name. The return value is unaffected by update or dry_run: it is simply the list of all files under src, with the names changed to be under dst.
0 请登录后投票
   发表时间:2010-09-29  
用python写的程序发现每秒大概能复制6 7 个图片文件(每个100k左右)

后来找到工具FastCopy,每秒大概能复制11个左右,速度更快,还有一些容错的功能
就直接用FastCopy,上面的代码就放弃了
0 请登录后投票
   发表时间:2010-10-08  
让我想起rsync。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics