gpt4 book ai didi

python - 如何快速复制文件

转载 作者:太空狗 更新时间:2023-10-29 17:43:19 25 4
gpt4 key购买 nike

在 python 程序中复制文件的最快方法是什么?

使用 shutil.copyfile() 复制文件比使用 Windows 文件资源管理器或 Mac 的 Finder 进行常规的右键单击复制 > 右键单击​​粘贴至少花费 3 倍的时间。在 Python 中是否有比 shutil.copyfile() 更快的替代方法?如何加快文件复制过程? (文件目标位于网络驱动器上......如果有任何不同......)。

稍后编辑:

这是我最终得到的结果:

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.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”慢一点。

与 shutil 相比,本地存储到 tmfps 的增益大约是 2 到 3 倍,而 NFS 到本地存储的增益大约是 6 倍。

分析之后,我注意到 shutil.copy 做了很多相当重量级的 fstat 系统。如果想进一步优化,我建议为 src 做一个 fstat 并重用这些值。老实说,我没有走得更远,因为我得到的数据几乎与本地 Linux 复制工具相同,并且优化几百毫秒不是我的目标。

关于python - 如何快速复制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22078621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com