Python:输出覆盖,输出进度百分比的实现
程序员文章站
2022-05-28 13:07:03
...
以文件复制器的代码为例
import os
import multiprocessing
def copy_file(q, i, file_names, new_file, file_list):
"""复制文件处理"""
open_file = open(file_names+"/"+i, "rb") # 按照路径打开文件并赋予以二进制位读取的权限
content = open_file.read() # 将文件内容保存下来
open_file.close()
new_open_file = open(new_file+"/"+i, "wb")
new_open_file.write(content) # 将文件内容写入
new_open_file.close()
# 复制好后向队列中加入文件数据
q.put(i)
def main():
# 将当前路径下所有目录保存下来
current_file = os.listdir(os.getcwd())
# 获取所要复制的文件夹
file_names = input("请输入要复制的文件夹:")
# 判断输入的目录名是否在当前路径中存在
if file_names in current_file:
try:
# 创建新的文件来接收复制,为防止重复创建报错,抓取异常
new_file = file_names + "[复件]"
os.mkdir(new_file)
except:
pass
# 得到目录下所有文件并以列表的形式保存
file_list = os.listdir(file_names)
# 调用multiprocessing模块中Manager()类里的Queue()方法,返回一个对象,在进程池中使用队列必须使用这种方法
q = multiprocessing.Manager().Queue()
# 获取输入的目录里文件的数量
old_file_num = len(file_list)
# 创建进程池,可同时进行5个进程
po = multiprocessing.Pool(5)
for i in file_list:
po.apply_async(copy_file, args=(q, i, file_names, new_file, file_list))
po.close()
# po.join() ,这里不让主进程等到所有文件都复制好才继续运行
copy_ok = 0
while True:
# 这里必须要取出数据,否则数据文件一直在队列中导致进程池中的队列是满的,从而出现异常,但是在进程池中不会报出异常
file_name = q.get()
# 计数加1
copy_ok += 1
# 这里用"\r"使每次输出左对齐,覆盖上一次输出结果
print("\r完成%.2f %%" % (copy_ok *100 / old_file_num), end="")
if copy_ok >= old_file_num:
break
else:
print("当前目录下没有该文件")
if __name__ == "__main__":
main()
print()
实验结果:
最后的百分比会从1%升到100%
·
进度百分比的实现事实上是在无限循环中通过输出重复覆盖实现的,如上代码中
# 这里用"\r"使每次输出左对齐,覆盖上一次输出结果
print("\r完成%.2f %%" % (copy_ok *100 / old_file_num), end="")
这里前面的 ‘\r’转义字符是将光标移到一行的开始,所以\r之后的内容会覆盖掉上次打印的内容
这里通过重复的覆盖上一条输出,从而展现进度百分比从1%到100%的动态显示
上一篇: Python:字符串中的大小写转换