从Python中的文件随机生成测验问题

从Python中的文件随机生成测验问题,python,python-3.x,random,Python,Python 3.x,Random,我只是在练习Python,有一个问题,我试图从一个文本文件中生成一个测验,它将从该文件中随机询问一个问题 它应该先阅读问题,然后列出答案,用文件中的逗号分隔,在尝试随机分组之前,这些逗号确实起作用 此时,它正在读取行的第一个字符,然后在尝试打印“详细信息[1]”时显示错误“列表索引超出范围”。例如,如果它选择文本文件中的第3行,将读取“C”,则输入时将出现错误 文本文件如下: A,What is 1+1?,1,2,3,4,b, B,What is 2+2?,1,2,3,4,d, C,What i

我只是在练习Python,有一个问题,我试图从一个文本文件中生成一个测验,它将从该文件中随机询问一个问题

它应该先阅读问题,然后列出答案,用文件中的逗号分隔,在尝试随机分组之前,这些逗号确实起作用

此时,它正在读取行的第一个字符,然后在尝试打印“详细信息[1]”时显示错误“列表索引超出范围”。例如,如果它选择文本文件中的第3行,将读取“C”,则输入时将出现错误

文本文件如下:

A,What is 1+1?,1,2,3,4,b,
B,What is 2+2?,1,2,3,4,d,
C,What is 3+3?,2,4,6,8,c,
D,What is 4+4?,4,8,12,18,b,
E,What is 6+6?,18,12,10,9,b,
F,What is 1+2?,1,2,3,4,c,
G,What is 5+5?,5,6,7,10,d,
H,What is 2*2?,2,4,6,8,b, 
import random
class question:
def rand_line(fname):
        lines = open(fname).read().splitlines()
        return random.choice(lines)

file = rand_line("questions.txt")

for line in file:
    detail = line.split(",")
    print(detail[0])
    input()
    print(detail[1])
    print("a: ", detail[2])
    print("b: ", detail[3])
    print("c: ", detail[4])
    print("d: ", detail[5])
    print("Select A, B, C or D: ")
    select = input()
    if select == detail[6]:
        print("correct!")
    else:
        print("incorrect")
代码如下:

A,What is 1+1?,1,2,3,4,b,
B,What is 2+2?,1,2,3,4,d,
C,What is 3+3?,2,4,6,8,c,
D,What is 4+4?,4,8,12,18,b,
E,What is 6+6?,18,12,10,9,b,
F,What is 1+2?,1,2,3,4,c,
G,What is 5+5?,5,6,7,10,d,
H,What is 2*2?,2,4,6,8,b, 
import random
class question:
def rand_line(fname):
        lines = open(fname).read().splitlines()
        return random.choice(lines)

file = rand_line("questions.txt")

for line in file:
    detail = line.split(",")
    print(detail[0])
    input()
    print(detail[1])
    print("a: ", detail[2])
    print("b: ", detail[3])
    print("c: ", detail[4])
    print("d: ", detail[5])
    print("Select A, B, C or D: ")
    select = input()
    if select == detail[6]:
        print("correct!")
    else:
        print("incorrect")

在我这方面进行了测试之后,似乎单靠“input()”可能不起作用。您使用“输入”将用户写入的内容存储为变量,因此必须将其放在变量上,这不是自动完成的

x = input('Write your answer : a, b, c or d')

我一点也不确定问题是否真的存在,这只是一些尝试性的帮助,在我这方面进行了测试之后,似乎单靠“input()”可能不起作用。您使用“输入”将用户写入的内容存储为变量,因此必须将其放在变量上,这不是自动完成的

x = input('Write your answer : a, b, c or d')

我一点也不确定问题是否真的在这里,这只是一些试图帮助你的想法

我想这是一句让你感到困惑的话:

file=rand\u行(“questions.txt”)

您称之为file,但实际上它只是文件中的一个随机行,如下所示:

C,什么是3+3?,2,4,6,8,C,

当你进行
拆分(',')
时,你的
细节只会

['C']

我认为您希望该行成为列表/数组。要做到这一点,请将您的
rand\u行用方括号括起来
[]

file=[rand\u line(“questions.txt”)]

将上述输出更改为:

['C,什么是3+3?,2,4,6,8,C']

现在,当您执行
拆分(',')
时,您的
详细信息是

['C'、'3+3是什么?'、'2'、'4'、'6'、'8'、'C'、'']

不确定
input()
print(细节[0])
print(细节[1])

此外,为了避免字母选择的混合输入,将大小写更改为您知道答案在问题文件中的大小写可能是有益的:

  print("Select A, B, C or D: ")
    select = input().lower()
    if select == detail[6]:
例如:

答案在文件中为
c
,但提示您输入
c

另一件事是删除for循环。因为
文件
实际上只是一行:

  line = rand_line("questions.txt")

  detail = line.split(",")
  print(detail[0])
  print(detail[1])
  print("a: ", detail[2])
  print("b: ", detail[3])
  print("c: ", detail[4])

我认为这是一句让你感到困惑的话:

file=rand\u行(“questions.txt”)

您称之为file,但实际上它只是文件中的一个随机行,如下所示:

C,什么是3+3?,2,4,6,8,C,

当你进行
拆分(',')
时,你的
细节只会

['C']

我认为您希望该行成为列表/数组。要做到这一点,请将您的
rand\u行用方括号括起来
[]

file=[rand\u line(“questions.txt”)]

将上述输出更改为:

['C,什么是3+3?,2,4,6,8,C']

现在,当您执行
拆分(',')
时,您的
详细信息是

['C'、'3+3是什么?'、'2'、'4'、'6'、'8'、'C'、'']

不确定
input()
print(细节[0])
print(细节[1])

此外,为了避免字母选择的混合输入,将大小写更改为您知道答案在问题文件中的大小写可能是有益的:

  print("Select A, B, C or D: ")
    select = input().lower()
    if select == detail[6]:
例如:

答案在文件中为
c
,但提示您输入
c

另一件事是删除for循环。因为
文件
实际上只是一行:

  line = rand_line("questions.txt")

  detail = line.split(",")
  print(detail[0])
  print(detail[1])
  print("a: ", detail[2])
  print("b: ", detail[3])
  print("c: ", detail[4])

在循环之前查看
文件
。里面有什么?然后查看循环本身:
用于文件中的行
。这还有意义吗?
line
在循环中有什么值?将
random.choice(…
更改为
random.choices(…
在循环之前查看
文件
。它包含什么?然后查看循环本身:
文件中的行
。这仍然有意义吗?
在循环中有什么值?将
随机。选择(…
更改为
随机。选择(…
这与在他们的问题中提到的“列表索引超出范围”错误OP?这可以帮助他,所以我认为值得一提。正如我所说的,我绝对不确定这是否与他的错误有关,这只是尝试帮助。如果你认为这不合适,我可以关闭。谢谢你的回答输入()只是我之前测试了一些东西,可能应该在发布之前删除它。:)这与“列表索引超出范围”有什么关系“他们的问题中提到了错误OP?这可以帮助他,所以我认为值得一提。正如我所说的,我绝对不确定这是否与他的错误有关,这只是尝试帮助。如果你认为这不合适,我可以关闭。谢谢你的回答输入()只是我之前测试了一些东西,可能应该在发布之前删除它。:)太好了,非常感谢您,这正是我所需要的。input()只是我测试了一些东西以及行中的第一个字符(可能应该在发布之前删除这些字符)。更改案例也是我将要添加的内容,因此也非常感谢。那太好了,非常感谢您正是我所需要的。input()只是我测试了一些内容以及行中的第一个字符(可能应该在发布之前删除这些).换箱子也是我要补充的,所以也谢谢你。