终端中带有块字符的文本进度条[关闭]

2023-11-25

我编写了一个简单的控制台应用程序,用于使用 ftplib 从 FTP 服务器上传和下载文件。

我希望该应用程序向用户显示其下载/上传进度的一些可视化;每次下载数据块时,我希望它提供进度更新,即使它只是像百分比这样的数字表示。

重要的是,我想避免删除前几行中打印到控制台的所有文本(即我不想在打印更新的进度时“清除”整个终端)。

这似乎是一个相当常见的任务——我如何制作一个进度条或类似的可视化,输出到我的控制台,同时保留先前的程序输出?


Python 3

一个简单的、可定制的进度条

以下是我经常使用的以下许多答案的汇总(无需导入)。

Note:本答案中的所有代码都是为 Python 3 创建的;请参阅答案末尾以将此代码与 Python 2 一起使用。

# Print iterations progress
def printProgressBar (iteration, total, prefix = '', suffix = '', decimals = 1, length = 100, fill = '█', printEnd = "\r"):
    """
    Call in a loop to create terminal progress bar
    @params:
        iteration   - Required  : current iteration (Int)
        total       - Required  : total iterations (Int)
        prefix      - Optional  : prefix string (Str)
        suffix      - Optional  : suffix string (Str)
        decimals    - Optional  : positive number of decimals in percent complete (Int)
        length      - Optional  : character length of bar (Int)
        fill        - Optional  : bar fill character (Str)
        printEnd    - Optional  : end character (e.g. "\r", "\r\n") (Str)
    """
    percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))
    filledLength = int(length * iteration // total)
    bar = fill * filledLength + '-' * (length - filledLength)
    print(f'\r{prefix} |{bar}| {percent}% {suffix}', end = printEnd)
    # Print New Line on Complete
    if iteration == total: 
        print()

使用示例

import time

# A List of Items
items = list(range(0, 57))
l = len(items)

# Initial call to print 0% progress
printProgressBar(0, l, prefix = 'Progress:', suffix = 'Complete', length = 50)
for i, item in enumerate(items):
    # Do stuff...
    time.sleep(0.1)
    # Update Progress Bar
    printProgressBar(i + 1, l, prefix = 'Progress:', suffix = 'Complete', length = 50)

样本输出

Progress: |█████████████████████████████████████████████-----| 90.0% Complete

Update

评论中讨论了允许进度条动态调整到终端窗口宽度的选项。虽然我不推荐这样做,但这里有一个gist实现此功能(并注明注意事项)。

上述的单次调用版本

下面的评论引用了一个很好的answer发布于回答类似的问题。我喜欢它所展示的易用性,并写了一个类似的,但选择忽略了sys模块,同时添加了原有的一些功能printProgressBar上面的函数。

与上面的原始函数相比,这种方法的一些好处包括消除了对函数的初始调用以在 0% 处打印进度条以及使用enumerate成为可选的(即不再明确需要使该功能起作用)。

def progressBar(iterable, prefix = '', suffix = '', decimals = 1, length = 100, fill = '█', printEnd = "\r"):
    """
    Call in a loop to create terminal progress bar
    @params:
        iterable    - Required  : iterable object (Iterable)
        prefix      - Optional  : prefix string (Str)
        suffix      - Optional  : suffix string (Str)
        decimals    - Optional  : positive number of decimals in percent complete (Int)
        length      - Optional  : character length of bar (Int)
        fill        - Optional  : bar fill character (Str)
        printEnd    - Optional  : end character (e.g. "\r", "\r\n") (Str)
    """
    total = len(iterable)
    # Progress Bar Printing Function
    def printProgressBar (iteration):
        percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))
        filledLength = int(length * iteration // total)
        bar = fill * filledLength + '-' * (length - filledLength)
        print(f'\r{prefix} |{bar}| {percent}% {suffix}', end = printEnd)
    # Initial Call
    printProgressBar(0)
    # Update Progress Bar
    for i, item in enumerate(iterable):
        yield item
        printProgressBar(i + 1)
    # Print New Line on Complete
    print()

使用示例

import time

# A List of Items
items = list(range(0, 57))

# A Nicer, Single-Call Usage
for item in progressBar(items, prefix = 'Progress:', suffix = 'Complete', length = 50):
    # Do stuff...
    time.sleep(0.1)

样本输出

Progress: |█████████████████████████████████████████████-----| 90.0% Complete

Python 2

要在 Python 2 中使用上述函数,请在脚本顶部将编码设置为 UTF-8:

# -*- coding: utf-8 -*-

并替换此行中的 Python 3 字符串格式:

print(f'\r{prefix} |{bar}| {percent}% {suffix}', end = printEnd)

使用 Python 2 字符串格式:

print('\r%s |%s| %s%% %s' % (prefix, bar, percent, suffix), end = printEnd)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

终端中带有块字符的文本进度条[关闭] 的相关文章

  • (discord.py) 尝试更改成员角色时,“用户”对象没有属性“角色”

    因此 我正在尝试编写一个机器人 让某人在命令中指定的主持人指定的一段时间内暂停角色 我知道该变量称为 小时 即使它目前以秒为单位 我稍后会解决这个问题 基本上 它是由主持人在消息 暂停 personmention numberofhours
  • Django REST序列化器:创建对象而不保存

    我已经开始使用 Django REST 框架 我想做的是使用一些 JSON 发布请求 从中创建一个 Django 模型对象 然后使用该对象而不保存它 我的 Django 模型称为 SearchRequest 我所拥有的是 api view
  • Python PAM 模块的安全问题?

    我有兴趣编写一个 PAM 模块 该模块将利用流行的 Unix 登录身份验证机制 我过去的大部分编程经验都是使用 Python 进行的 并且我正在交互的系统已经有一个 Python API 我用谷歌搜索发现pam python http pa
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • keras加载模型错误尝试将包含17层的权重文件加载到0层的模型中

    我目前正在使用 keras 开发 vgg16 模型 我用我的一些图层微调 vgg 模型 拟合我的模型 训练 后 我保存我的模型model save name h5 可以毫无问题地保存 但是 当我尝试使用以下命令重新加载模型时load mod
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • 使用 OpenPyXL 迭代工作表和单元格,并使用包含的字符串更新单元格[重复]

    这个问题在这里已经有答案了 我想使用 OpenPyXL 来搜索工作簿 但我遇到了一些问题 希望有人可以帮助解决 以下是一些障碍 待办事项 我的工作表和单元格数量未知 我想搜索工作簿并将工作表名称放入数组中 我想循环遍历每个数组项并搜索包含特
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐

  • 母版初始化文化没有找到合适的方法来覆盖错误?

    我正在尝试使用 ASP NET 和 C 开发一个多语言网站 我的问题是 我想让我的 MasterPage 支持在语言之间切换 但是当我将 InitializeCulture 放入 masterpage cs 中时 出现此错误 这是我的代码
  • 在表视图单元格中编辑文本字段的最佳方法

    在我的应用程序中 我有很多views需要到位editable 我有tableviewcells设置以包括UITextField已启用 并且可以更改文本 这很好 它可以工作 我的问题是跟踪这些的最佳方法是什么 我是不是该 Keep an iV
  • Windows 8 包裹面板

    我在自动将 StackPanel 分成下一行时遇到问题 这是示例代码
  • .NET隐藏标题栏但保留边框

    I was wondering how to hide the titlebar of a form but keep the original border like e g Dropbox does 提前致谢 Set FormBorde
  • 在浏览器中使用 javascript 按类设置 html 输入元素的值?

    我需要根据类 class Qty 设置一堆输入框的值 如果我使用 ElementID 这会起作用 document getElementById G Qty 0 value 101 但这不起作用 document getElementsBy
  • 如何覆盖屏幕阅读器对句子中单词的发音而不使其在句子中暂停?

    假设我有以下 HTML 句子 p Please enter your licence number p 屏幕阅读器将 licence 一词误读为 liss ens 语音拼写 它应该发音为 lice ens 语音拼写 我想通过向屏幕阅读器提供
  • 捕获的 Throwable 或异常为 null

    类似的问题在这里被问了两次 但从未得到任何答案 或者回答是 不可能 抱歉 可能太多了 try the line that causes the error LinearLayout cell LinearLayout inflater in
  • Matplotlib 在循环中绘图时内存不足

    我有一个相当简单的绘图例程 如下所示 from future import division import datetime import matplotlib matplotlib use Agg from matplotlib pypl
  • 哪些项目文件不应签入 SVN

    目前 我签入了所有文件 包括 dll VS 解决方案文件 图像等 我经常需要将这些文件签出到临时服务器或其他开发人员 因此拥有这些文件意味着项目已准备就绪 这里的最佳实践是什么 编辑 如果我不添加生成的文件 例如 dll 文件 如何确保它们
  • PHP SOAP 调用中多个同名元素

    我知道这类问题已经被问过很多次了 我花了几个小时阅读并尝试提供的解决方案 但似乎没有一个适合我的情况 我需要向 API 发送 SOAP 请求 该请求可以包含重复的元素 如下所示
  • 我如何(有办法)将 HRESULT 转换为系统特定的错误消息?

    根据this 没有办法将 HRESULT 错误代码转换为 Win32 错误代码 因此 至少据我理解 我使用 FormatMessage 来生成错误消息 即 std wstring Exception GetWideMessage const
  • 我可以设置viewpager的项目宽度吗?

    我希望我可以在viewpager的页面中显示3个项目 但是现在我只能设置viewpager的padding值和margin值 所以它在viewpager的页面中只显示一个项目 如何设置项目宽度 我认为如果我可以设置更小的项目宽度 viewp
  • 我什么时候应该选择IsolatedStorage 和AppData 文件存储?

    我最近发现了IsolatedStorage net 中的设施 我想知道什么时候应该将它们用于我的应用程序数据 什么时候应该使用 例如 Application LocalUserAppDataPath 我注意到的一件事是Application
  • 使用 Magick++ 获取像素颜色?

    我已经问过这个问题了 但那是关于FreeImage 现在我正在尝试做同样的事情ImageMagick 更正确地说 与Magick 我所需要的只是获取图像中像素的 RGB 值 并能够将其打印到屏幕上 我在ImageMagick论坛 不过好像没
  • 从动态库调用函数

    当我们在编译时不知道函数的名称时 如果可能的话 加载动态库并调用其函数之一的最佳方法是什么 例如 有没有一种方法可以让程序从文件中读取字符串 然后加载DLL并搜索并调用名称为从文件中读取的字符串的函数 非常感谢您的帮助 有一个example
  • 求函数在给定范围内的根

    我有一组函数f t有几个根 实际上是两个 我想找到 第一个 根并用fsolve大部分时间都工作正常 问题是 当 t 趋向无穷大时 两个根会收敛 我的功能的一个简单例子是f t x x 2 1 t 所以越大t得到的 错误越多fsolve使 有
  • iOS 7 导航栏文本和箭头颜色

    我想将导航栏设置为背景black以及里面的所有颜色white 所以 我使用了这段代码 UINavigationBar appearance setTitleTextAttributes NSDictionary dictionaryWith
  • Numpy:具有可变列数的 loadtxt()

    我有一个制表符分隔值的文件 其中文件的前半部分有 3 列和 N 行 后半部分有 2 列和 M 行 我需要将这样的文件转换为两个单独的数组 一个 3xN 和一个 2xM Example 6 7900209022264466 3 8259897
  • 如何从一条管道中排放另一条管道中的水?

    我需要以编程方式从另一个管道中排出管道 这DataflowPipelineJob类没有drain方法实施 可以打电话吗drain使用 Java API 的管道 能够使用以下代码启动排水 spawn child pipe DataflowPi
  • 终端中带有块字符的文本进度条[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我编写了一个简单的控制台应用程序 用于使用 ftplib 从 FTP 服务器上传和下载文件 我希望该应用程序向用户显示其下载 上传进度的一些可视化 每次下载数据块时 我希望它提供