Python:如何快速复制文件

这个问题在这里已经有了答案:

  • 如何在python中复制文件? 14个答案

  • 最快的版本没有过度优化代码我用下面的代码得到:

    class CTError(Exception):
        def __init__(self, errors):
            self.errors = errors
    
    try:
        O_BINARY = os.O_BINARY
    except:
        O_BINARY = 0
    READ_FLAGS = os.O_RDONLY | O_BINARY
    WRITE_FLAGS = os.O_WRONLY | os.O_CREAT | os.O_TRUNC | O_BINARY
    BUFFER_SIZE = 128*1024
    
    def copyfile(src, dst):
        try:
            fin = os.open(src, READ_FLAGS)
            stat = os.fstat(fin)
            fout = os.open(dst, WRITE_FLAGS, stat.st_mode)
            for x in iter(lambda: os.read(fin, BUFFER_SIZE), ""):
                os.write(fout, x)
        finally:
            try: os.close(fin)
            except: pass
            try: os.close(fout)
            except: pass
    
    def copytree(src, dst, symlinks=False, ignore=[]):
        names = os.listdir(src)
    
        if not os.path.exists(dst):
            os.makedirs(dst)
        errors = []
        for name in names:
            if name in ignore:
                continue
            srcname = os.path.join(src, name)
            dstname = os.path.join(dst, name)
            try:
                if symlinks and os.path.islink(srcname):
                    linkto = os.readlink(srcname)
                    os.symlink(linkto, dstname)
                elif os.path.isdir(srcname):
                    copytree(srcname, dstname, symlinks, ignore)
                else:
                    copyfile(srcname, dstname)
                # XXX What about devices, sockets etc.?
            except (IOError, os.error), why:
                errors.append((srcname, dstname, str(why)))
            except CTError, err:
                errors.extend(err.errors)
        if errors:
            raise CTError(errors)
    

    这段代码的运行速度比原生linux“cp -rf”慢一点。

    相比之下,本地存储对tmfps的增益约为2x-3x,对于NFS到本地存储约为6x。

    分析后我注意到,shutil.copy会做很多fstat系统调用,它们相当重量级。 如果想进一步优化,我会建议为src做一个单独的fstat并重用这些值。 老实说,我没有更进一步,因为我得到了几乎相同的数字本地linux复制工具和优化几毫秒的hundrends不是我的目标。


    对于Windows,您可以简单地使用您正在进行复制的操作系统:

    from subprocess import call
    call(["xcopy", "c:file.txt", "n:folder", "/K/O/X"])
    

    / K - 复制属性。 通常,Xcopy将重置只读属性
    / O - 复制文件所有权和ACL信息。
    / X - 复制文件审计设置(隐含/ O)。


    import sys
    import subprocess
    
    def copyWithSubprocess(cmd):        
        proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    
    cmd=None
    if sys.platform.startswith("darwin"): cmd=['cp', source, dest]
    elif sys.platform.startswith("win"): cmd=['xcopy', source, dest, '/K/O/X']
    
    if cmd: copyWithSubprocess(cmd)
    
    链接地址: http://www.djcxy.com/p/42317.html

    上一篇: Python: How to Copy Files Fast

    下一篇: How to copy a file using python?