Python:输出覆盖,输出进度百分比的实现

tech2025-03-31  12

以文件复制器的代码为例

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%的动态显示

最新回复(0)