递归复制文件并显示进度
我之前在这里看到过关于Python和复制文件的问题,但我现在遇到的情况有点不同。
我快完成一个Linux系统安装程序了,现在只需要把文件复制到目标分区。大多数系统安装程序都有进度条,我也想加一个。
目前,我在用PyQt4,代码大概是这样的:
self.status('Counting files...')
self.count = int(check_output(['-c', 'find /opt/linux/work/root-image/ -type f | wc -l'], stderr = PIPE, shell = True))
self.status('Copying files...')
i = 0
for root, dirs, files in os.walk('/opt/linux/work/root-image/'):
for file in files:
i += 1
f = os.path.join(root, file)
try:
os.system('mkdir -p /tmp/foo' + os.path.split(f)[0])
except:
pass
os.system('cp ' + f + ' /tmp/foo' + f)
if i % 100 == 0:
self.emit(SIGNAL('progress(int)'), int(100.0 * float(i) / float(self.count)))
self.status('Done...')
但是这样做效率不高,因为进度条的原因。整个镜像文件有2.1GB
,脚本复制文件的时间真的很长,比起简单的cp -r
命令要慢得多。
有没有什么更有效的方法来做到这一点?对于单个文件的复制进度条,只需要一次读取小块数据,但我不知道怎么处理一个有91,489
个文件的目录。
任何帮助都会很有用。谢谢!
1 个回答
1
你可以试试用 shutil.copy
来复制文件,而不是用 os.system
去调用操作系统(这样会启动一个新的进程)。你还可以用 os.mkdir
来创建新的文件夹。不过,你确定慢是因为进度条的问题,而不是其他原因吗?