Python从文件中打印随机行而不重复

xma*_*xiy 6 python random text file python-3.x

我有一个小程序,可以从文本文件中打印随机行。我想将已经选择的行保存在列表或其他内容中,因此下次不再重复。

text_database.txt

  1. 这是一条线
  2. 这是另一条线
  3. 这是一条测试线
  4. 糟透了

这是显示输出是随机的并且程序重复行的示例,它不是终端中的直接输出:

This is a line
That sucks
That sucks
That sucks
This is a line
Run Code Online (Sandbox Code Playgroud)

我的代码:

# Variable for text file
text_database = './text_database.txt'

...

with open (text_database) as f:
    lines = f.readlines()
    print(random.choice(lines))
Run Code Online (Sandbox Code Playgroud)

我试过的

with open (text_database) as f:
    lines_list = []
    lines = f.readlines()
    random_tmp = random.choice(lines)
    if random_tmp not in lines_list:
        lines_list.append(random_tmp)
        print(random_tmp)
Run Code Online (Sandbox Code Playgroud)

它不起作用,我需要帮助。感谢大伙们。

use*_*432 5

from random import sample

file_name = "text_database.txt"
lines = open(file_name, "r").read().splitlines()

for line in sample(lines, k=len(lines)):
    print(line)
Run Code Online (Sandbox Code Playgroud)

我使用.read().splitlines()而不是.readlines()清除每行中的尾随空格(换行符)。我也可以这样做:

lines = [line.rstrip("\n") for line in open(file_name, "r")]
Run Code Online (Sandbox Code Playgroud)

这是random.sample对文档的描述:

返回从填充序列中选择的唯一元素的ak长度列表。用于随机抽样而无需更换。

另外,您可能需要重新整理行列表,然后遍历它们。

编辑-我想我现在明白了。这个怎么样?

def main():

    from random import shuffle

    file_name = "text_database.txt"
    lines = open(file_name, "r").read().splitlines()
    shuffle(lines)

    sentinel = object()

    def command_random():
        try:
            line = lines.pop()
        except IndexError:
            print("There are no more lines in the file!")
        else:
            print(line)

    def command_quit():
        nonlocal sentinel
        sentinel = None

    commands = {
        "random": command_random,
        "quit": command_quit
    }

    while sentinel is not None:
        user_input = input("Please enter a command: ")
        command = commands.get(user_input)
        if command is None:
            continue
        command()

    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())
Run Code Online (Sandbox Code Playgroud)


ger*_*vey 4

这是一个非常混乱的解决方案,但我事先已经测试过


f = open(text_database, "r")

list = []
list_of_nums = []

for i in f:
    list.append(i)

elif command == '/random':

    randomNum = random.randint(0, len(list) - 1)

    def reRun():
        global randomNum
        for i in list_of_nums:

            if randomNum == i:
                randomNum = random.randint(0, len(list) - 1)
                reRun()


    reRun()
    list_of_nums.append(randomNum)

    print(list[randomNum])

Run Code Online (Sandbox Code Playgroud)

这段代码的意思是遍历 f 中的所有行并将它们放入列表中。它选择一个介于 0 和列表长度之间的随机数并打印与该数字对应的随机行

希望这可以帮助!欢迎来到堆栈溢出