【问题标题】:printing dynamically string in one line in python在python中的一行中动态打印字符串
【发布时间】:2012-06-16 14:19:11
【问题描述】:

我正在尝试在一行中打印字符串。

我找到了解决方案,但它们无法在 Windows 上正常工作。

我有一个包含名称的文本文件,我想像这样打印它们

name=john 然后将 john 更改为下一个名称并保留 name=,我已编写此代码但无法在 windows 上正常工作:

op = open('names.txt','r')
print 'name=',
for i in op.readlines():
    print '\r'+i.strip('\n')

感谢您的宝贵时间

【问题讨论】:

  • 澄清一下,您想覆盖行的一部分,对吗?

标签: python command-line printing line


【解决方案1】:

在这种情况下,仅使用\r 将不起作用,因为这会将您返回到行首,因此您必须重新打印整行。此外,在某些系统(包括 Windows,我认为)中,Python 的 print 语句(3+ 中的函数)将 \r 解释为换行符。我相信这段代码应该独立于系统。

import sys, time

with open('names.txt', 'r') as names:
    prev_len = 0
    for name in names:
        sys.stdout.write('\r' + ' ' * prev_len)
        sys.stdout.flush()
        output_string = '\rname={}'.format(name.strip())
        prev_len = len(output_string)
        sys.stdout.write(output_string)
        sys.stdout.flush()
        time.sleep(0.3)
print

您也可以使用\b,这通常会将光标向后移动一个空格。

正如您所指出的,有必要用空格覆盖先前打印的行,这意味着有必要记住前一行的长度。我认为将这种状态封装在一个对象中是有意义的。这是使用该策略的比上面更清洁的解决方案:

import sys, time

class LineUpdater(object):
    def __init__(self, outfile=None):
        self.prev_len = 0
        self.outfile = sys.stdout if outfile is None else outfile

    def write(self, line):
        line = line.strip()
        output = '\r{:<{width}}'.format(line, width=self.prev_len)
        self.prev_len = len(line)
        self.outfile.write(output)
        self.outfile.flush()

with open('names.txt', 'r') as names:
    out = LineUpdater()
    for name in names:
        out.write('name={}'.format(name))
        time.sleep(0.3)
    print

【讨论】:

  • 先生,您的代码无法在 windows 上正常工作,问题是如果您打印长名称,例如 naaaaaaaaaaaaame,那么下一个名称将是 john,输出将类似于 johnaaaaaaaaaame 我在我发布此问题之前已经尝试过您的解决方案并且不适用于 Windows
  • 啊!当然——\r 通常用于打印等长的行。对于您的目的,这不适用于任何系统!我会更新的。
  • @EngHamoud,请参阅我的编辑。新代码应该可以正常工作。可能有更好的方法来做到这一点,但它至少有效!
  • 是的,它可以工作,非常感谢你,但实际上它有点杂乱无章,无论如何谢谢你,我会尝试找出更合适的方法
  • @EngHamoud,查看我最近的编辑,了解我认为最干净的解决方案。
【解决方案2】:

按照 senderle 的建议使用 '\b'

import sys
import time

sys.stdout.write('name=')
last_lenght = 0
with open('names.txt') as names:
    for name in names:
        sys.stdout.write('\b' * last_lenght)    # go back
        sys.stdout.write(' ' * last_lenght)     # clear last name
        sys.stdout.write('\b' * last_lenght)    # reposition
        sys.stdout.write(name.strip())
        sys.stdout.flush()
        last_lenght = len(name.strip())
        time.sleep(0.5)

【讨论】:

    猜你喜欢
    • 2018-03-16
    • 2015-12-30
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    相关资源
    最近更新 更多