【问题标题】:How to print one word at a time on one line?如何在一行上一次打印一个单词?
【发布时间】:2017-09-12 04:10:00
【问题描述】:

我想编写允许我打印一个单词然后它消失并打印下一个单词的代码。例如,如果我有“Hello World!”,程序应该打印“Hello”,然后这个词消失,然后是“World!”打印然后消失。我也应该能够改变打印单词的速度。目前我已经能够弄清楚如何以一定的速度打印字符,但是如何逐个打印单词呢?

import time
import sys

def print_char(s):
    for c in s:
        sys.stdout.write( '%s' % c )
        sys.stdout.flush()
        time.sleep(0.1)

print_char("hello world")

【问题讨论】:

    标签: python time sys


    【解决方案1】:

    试试这个:

    #!/usr/bin/env python3
    
    import sys
    import time
    
    data = "this is a sentence with some words".split()
    
    max_len=max([len(w) for w in data])
    pad = " "*max_len
    for w in data:
        sys.stdout.write('%s\r' % pad)
        sys.stdout.write("%s\r" % w)
        sys.stdout.flush()
        time.sleep(0.4)
    
    print
    

    例如,只是为了好玩

    【讨论】:

    • 我通过 Python shell 运行此代码,但得到的结果与 gif 文件不同。
    • 哪个python版本? which os(在 gif 中我使用 sleep 0.4 只是为了清楚地分离单词)
    • python 3.3.2 我有 Windows 8
    • 使用 python 3.3.0(在 linux 上)测试,它可以工作。将代码更新为我的确切版本(在 gif 中使用)。希望对您有所帮助...
    • 我正在使用 python 3.3.2 shell,但我仍然遇到同样的问题
    【解决方案2】:

    如果words 是一个字符串列表:

    def print_char(words):
        for s in words:
            for c in s:
                sys.stdout.write('%s' %c)
                sys.stdout.flush()
                time.sleep(0.1)
            # erase the word
            sys.stdout.write('\b'*len(s))  # backspace the cursor
            sys.stdout.write(' '*len(s))  # overwrite with spaces
            sys.stdout.write('\b'*len(s))  # backspace again, to write the next word
    

    【讨论】:

    • 如何使用sys.stdout.write("%s\r"% s) 以及在此之前与 witespace 相同的 word 中字符串的最大长度?
    • 当我运行这段代码时,它会在所有字符之间添加一个空格。它不是删除前面的单词。至少有办法让我一个一个打印单词吗?
    • 我刚刚在 python3.3 上测试了这个,它可以按照你的 OP 中的描述工作。您想在单独的行中打印每个单词,还是要擦除每个单词并用下一个单词覆盖它?另外,你用的是哪个版本的python?
    • 我想删除这个单词并用下一个单词替换它。我正在使用 python 3.3
    • @edboysega321:那么这段代码应该可以工作。它适用于我的 py3.3
    【解决方案3】:

    根据这个问题的答案:

    remove last STDOUT line in Python

    你可以这样做:

    import time
    import sys
    
    CURSER_UP_ONE = '\x1b[1A'
    ERASE_LINE = '\x1b[2K'
    
    def delay_print(sentence, pause_between_words):
        for s in sentence.split(" "):
            sys.stdout.write( '%s' % s)
            sys.stdout.flush()
            time.sleep(pause_between_words)
            print(ERASE_LINE + CURSER_UP_ONE)
    
    delay_print("Hello World!", 0.5)
    

    此代码将在我的终端中一次打印一个单词,删除最后一个单词并打印下一个。最后一个词将在终止前被删除。这是你想要的工作方式吗?否则请告诉我。

    编辑:注意到您还希望在每个字符打印之间有一个延迟。已相应地更新了我的代码。

    编辑:根据您的评论,我通过字符打印删除了字符。

    【讨论】:

    • 我想打印一个单词,然后这个单词被擦除,下一个单词被打印出来。我不想一个一个地打印一个字符
    • 我已经相应地更新了我的代码以反映这一点。现在怎么样了?
    【解决方案4】:

    这可能不是您想要的,也可能不如其他一些答案那么快,但您可以这样做:

    import time, os
    
    text = "This is a long sentence that has a lot of words in it.".split()
    
    for i in range(len(text)):
        os.system("clear")
        print(text[i])
        time.sleep(0.5)
        os.system("clear")
    

    其中 text 是您要输入的文本,time.sleep(XXX) 是显示的单词之间的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      相关资源
      最近更新 更多