+def copy_with_progress(total_size, infile, outfile):
+ def pp_size(size):
+ suffixes = ["", "KiB", "MiB", "GiB"]
+ for i, suffix in enumerate(suffixes):
+ if size < 1024:
+ break
+ size /= 1024
+ return "%d %s" % (size, suffix)
+
+ start_ts = time.time()
+ last_ts = 0
+ bytes_read = 0
+ while True:
+ now = time.time()
+ if now - last_ts > 0.5:
+ last_ts = now
+ sys.stdout.write("\33[2K\r")
+ sys.stdout.write("%s / %s (%s/sec)" % (
+ pp_size(bytes_read),
+ pp_size(total_size),
+ pp_size(bytes_read / (now - start_ts)),
+ ))
+ sys.stdout.flush()
+
+ buf = infile.read(32768)
+ if not buf:
+ break
+ outfile.write(buf)
+ bytes_read += len(buf)
+