我的progress bar无进展的原因是什么?是否陷入循环?
解决alive-progress进度条不更新的问题
你的代码里有几个关键问题导致进度条无法正常工作:
- 文件指针被耗尽:调用
f.readlines()后,文件对象的指针已经移动到文件末尾,后续的for line in f不会遍历任何行,进度条自然不会触发更新。 - alive_bar参数重复计算长度:
data本身就是len(f.readlines())的结果,传入alive_bar时不需要再套一层len()。 - 文件句柄未安全管理:手动调用
result.close()容易因异常导致文件未正确关闭,建议用with语句自动管理。
修正后的代码(小文件适用)
这种方式一次性读取所有行到内存,适合文件体积不大的场景:
import io from datetime import datetime from alive_progress import alive_bar start_time = datetime.now() print(f"Empece en: {start_time}") # 用with语句自动管理结果文件的打开/关闭 with io.open("Edificado/edificadoResultadoSinPorBlancos.txt","w",encoding='utf-8',errors="surrogateescape") as result: with io.open("Edificado/edificco.txt","r",encoding='utf-8',errors="surrogateescape" ) as f: lines = f.readlines() # 直接传入总行数给alive_bar with alive_bar(len(lines)) as bar: for line in lines: if '|' in line: line = line.replace("|","-") result.write(line) bar() end_time = datetime.now() print('Duracion: {}'.format(end_time - start_time))
大文件优化版
如果处理的是超大文件,不想一次性加载所有内容到内存,可以先统计行数再重置文件指针:
import io from datetime import datetime from alive_progress import alive_bar start_time = datetime.now() print(f"Empece en: {start_time}") with io.open("Edificado/edificadoResultadoSinPorBlancos.txt","w",encoding='utf-8',errors="surrogateescape") as result: with io.open("Edificado/edificco.txt","r",encoding='utf-8',errors="surrogateescape" ) as f: # 先统计总行数,不加载全部内容 line_count = sum(1 for _ in f) # 将文件指针重置到开头 f.seek(0) with alive_bar(line_count) as bar: for line in f: if '|' in line: line = line.replace("|","-") result.write(line) bar() end_time = datetime.now() print('Duracion: {}'.format(end_time - start_time))
内容的提问来源于stack exchange,提问作者imnach2
相关产品推荐
相关产品推荐

