当前位置: 首页 > 面试题库 >

Python:如何快速复制文件

谢夜洛
2023-03-14
问题内容

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

如何在Python中复制文件?
(17个答案)

5年前关闭。

shutil.copyfile()使用Windows File Explorer或Mac’s
Finder将文件复制到常规右键单击复制>右键单击粘贴的时间至少要长3倍。有没有比shutil.copyfile()Python更快的替代方法?可以采取什么措施来加快文件复制过程?(文件目标位于网络驱动器上……如果有任何区别……)。

编辑后:

这是我最终得到的结果:

def copyWithSubprocess(cmd):        
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

win=mac=False
if sys.platform.startswith("darwin"):mac=True
elif sys.platform.startswith("win"):win=True

cmd=None
if mac: cmd=['cp', source, dest]
elif win: cmd=['xcopy', source, dest, '/K/O/X']

if cmd: copyWithSubprocess(cmd)

问题答案:

最快的版本,没有使用以下代码过度优化我的代码:

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.html" target="_blank">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的收益大约是2倍至3倍,而NFS到本地存储则是6倍左右。

分析后,我注意到shutil.copy做了很多非常重要的fstat
syscal。如果要进一步优化,我建议对src做一个fstat并重用这些值。老实说,我没有走更远的一步,因为我得到的数字几乎与本地linux复制工具相同,而优化几百毫秒并不是我的目标。



 类似资料:
  • 问题内容: 从某些索引开始,肯定有一些使用Swift拷贝数组末尾的非常优雅的方法,但是我只是找不到它,所以我以此结束: 有没有其他功能的更好方法吗? 问题答案: 还有一个… 这给出了对于大多数目的来说应该足够好的。如果您需要一个真实的,请使用 如果起始索引大于(或等于)元素计数,则会创建一个空数组/切片。

  • 问题内容: 如何在Python中复制文件? 我找不到任何东西。 问题答案: ┌──────────────────┬────────┬───────────┬───────┬────────────────┐ │ Function │ Copies │ Copies │Can use│ Destination │ │ │metadata│permissions│buffer │may be dir

  • 问题内容: 在Swift中,当您传递值类型时,对函数说一个数组。制作了数组的副本以供该函数使用。 但是https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP400

  • Swift版本3。 我正在着手将我的realm.default文件复制到我的应用程序中,如果它不存在的话,这样我就可以将它打包为发行版的一部分。该文件需要是可变的,所以我将其复制到文档目录。 不幸的是,我得到一个文件不存在的错误。我已经验证了路径是正确的,并且.app中有该文件。 下面是我的应用程序委托加载领域文件的代码: 以下是错误消息(上下文用粗体表示): 出现错误,以下是详细信息:error

  • 问题内容: 我刚刚开始学习来自Android的iOS的Apple Swift编程。我现在基本上可以阅读和操作swift代码,还学习了iOS swift编程中使用的一些通用类,但是仍然对语法和所有内容感到困惑。 我正在尝试下载文件。就像,让我们说来自这个网址 在一个按钮中单击。也许也有视觉进步 通过在stackoverflow中搜索,我偶然发现了Alamofire。我可以尝试一下,但是我不确定这是否

  • 问题内容: 我有一个Python程序,可与字典配合使用。我必须复制字典数千次。我需要密钥和关联内容的副本。该副本将被编辑,并且不得链接到原始副本(例如,副本中的更改不得影响原始副本。) 键是字符串,值是整数(0/1)。 我目前使用一种简单的方法: 对我的代码进行性能分析表明,复制操作花费了大部分时间。 有没有更快的替代方法?什么是最快的? 问题答案: 查看Python操作的C源代码,您会发现它们做