【问题标题】:How to Print Random Words from a Text File如何从文本文件中打印随机单词
【发布时间】:2017-08-04 17:48:37
【问题描述】:

我有一个包含 2000 个单词的文本文件,每行一个单词。我正在尝试创建一个代码,该代码每 10 秒从同一行的文本文件中打印出两个随机单词。我的文本文件的开头部分如下所示:

slip
melt
true
therapeutic
scarce
visitor
wild
tickle
.
.
.

我写的代码是:

from time import sleep
import random

my_file = open("words.txt", "r")


i = 1
while i > 0:
    number_1 = random.randint(0, 2000)
    number_2 = random.randint(0, 2000)
    word_1 = my_file.readline(number_1)
    word_2 = my_file.readline(number_2)
    print(word_1.rstrip() + " " + word_2.rstrip())
    i += 1
    sleep(10)

当我执行代码而不是打印两个随机单词时,它会从文本顶部开始按顺序打印所有单词。我不确定为什么会发生这种情况,因为 number_1 和 number_2 在循环内,所以每次两个单词 print number_1 和 number_2 都应该更改为另外两个随机数。我认为在循环之外替换 number_1 和 number_2 也不会起作用,因为它们将被固定为两个值,并且代码将继续打印相同的两个单词。有谁知道我可以做些什么来修复代码?

【问题讨论】:

    标签: python python-3.x random text-files


    【解决方案1】:

    readline() 不带任何参数,只返回文件输入中的下一行*。相反,尝试使用readlines() 创建一个列表,然后从该列表中随机选择。所以在这里,你会创建word_list = my_file.readlines(),然后从word_list 中选择随机元素。

    *更正: readline() 确实采用了要读取的字节数的参数。该函数的文档似乎没有明确说明这一点。谢谢 E. Ducateme!

    【讨论】:

    • @Dan Waxman ... 小修正 ... .readline() 确实带了一个参数,但大多数人不使用它。 .readline() 的文档并不清楚,但它说:examplefile.readline(size=-1, /)。将非负大小放入方法中将从当前行返回该字节数。
    • @E.Ducateme 谢谢!我在发布之前简要检查了 IO 文档,没有看到列出的任何参数,这让我对他的代码是如何工作的感到困惑。我更正了答案。
    【解决方案2】:

    my_file.readline(number_1) 不会做你想做的事。 readline 的参数是您可以读取的行的最大大小(以字节为单位),而不是该行在文件中的位置。

    正如另一个答案提到的,更好的方法是首先将行读入列表,然后从中随机选择单词:

    from time import sleep
    import random
    
    my_file = open("words.txt", "r")
    words = my_file.readlines()
    
    i = 1
    while i > 0:
        number_1 = random.randint(0, 2000)
        number_2 = random.randint(0, 2000)
        word_1 = words[number_1]
        word_2 = words[number_2]
        print(word_1.rstrip() + " " + word_2.rstrip())
        i += 1
        sleep(10)
    

    【讨论】:

    • 一个小的改进也将是简单地使用word_1 = random.choice(words) 来选择一个随机词,而不是执行使用random.randint() 选择一个整数然后将该整数作为用于在列表中该索引位置查找单词的索引。这不是 OP 的问题,而是将其作为细微差别包含在内。
    • 如果你想避免两次选择同一个词(RNG 可以做到),那么要么检查两个数字是否相等,要么使用类似 number_1 = random.randint(0, 2000)number_2 = (number_1 + random.randint(0, 1999)) % 2000 的东西
    猜你喜欢
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    相关资源
    最近更新 更多