xma*_*xiy 6 python random text file python-3.x
我有一个小程序,可以从文本文件中打印随机行。我想将已经选择的行保存在列表或其他内容中,因此下次不再重复。
例
text_database.txt
- 这是一条线
- 这是另一条线
- 这是一条测试线
- 糟透了
这是显示输出是随机的并且程序重复行的示例,它不是终端中的直接输出:
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)
它不起作用,我需要帮助。感谢大伙们。
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)
这是一个非常混乱的解决方案,但我事先已经测试过
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 和列表长度之间的随机数并打印与该数字对应的随机行
希望这可以帮助!欢迎来到堆栈溢出