Python 如何读取包含测验问题和答案的文件,该文件保存为列表的字符串表示形式?

Python 如何读取包含测验问题和答案的文件,该文件保存为列表的字符串表示形式?,python,tkinter,file-io,Python,Tkinter,File Io,我正在用Python创建一个可以编辑的测验,但是其中一个部分需要将问题保存在一个文件中。在这段代码中,我尝试读取文件,然后将它读取的内容放入列表中,这样我就可以在某些按钮上显示某些问题。但我不断收到错误,说列表不可调用 我曾尝试使用strip来删除出现的引号字符串,但出现了一个错误,即 “列表”对象没有属性“strip” 我对Python比较陌生,因此我正在努力寻找其他修复方法,我尝试将打印内容隔离在不同的行中,然后将其放入列表中,但结果表明列表无法再次调用 textquestions=open

我正在用Python创建一个可以编辑的测验,但是其中一个部分需要将问题保存在一个文件中。在这段代码中,我尝试读取文件,然后将它读取的内容放入列表中,这样我就可以在某些按钮上显示某些问题。但我不断收到错误,说列表不可调用

我曾尝试使用
strip
来删除出现的引号字符串,但出现了一个错误,即

“列表”对象没有属性“strip”

我对Python比较陌生,因此我正在努力寻找其他修复方法,我尝试将打印内容隔离在不同的行中,然后将其放入列表中,但结果表明列表无法再次调用

textquestions=open('listofquestions','r')

allthequestions = textquestions.readlines()

forbuttons=[print(allthequestions)]

textquestions.close

q1 = forbuttons(0)

buttonq1 = tk.Button(self, text=forbuttons[q1][0])
buttonq1.pack()
文件中只写了这一点,没有其他内容(首先填写问题以使其工作):

然而,当它们被打印出来时,它们似乎是这样打印的:

'["What would you wear to work?","Hoodie", "Suit", "Shorts","2"],["How would you greet a customer?","Hey", "Hi", "Hello", "0"],["How many years of experience do you have?","Loads", "None", "Some","1"],["Why do you want to work here?","It's fun", "No money", "Friend told me to","2"]'
What would you wear to work?,Hoodie, Suit, Shorts,2 How would you greet a customer?,Hey, Hi, Hello, 0 How many years of experience do you have?,Loads, None, Some,1 Why do you want to work here?,It's fun, No money, Friend told me to,2
我认为所有这些引语都阻止了列表的运行?虽然我不确定,但可能代码的其余部分也不正确。

您需要解析从文本文件读取的字符串,以便Python以结构化方式查看其内容

一种非常简单的方法是添加
[
]
,并将其视为一个结构:

import json

with open('listofquestions') as textquestions:
    questions_json = '[' + textquestions.read() + ']'
    allthequestions = json.loads(questions_json)

Python’也可以工作,但如果输入数据不可信(它将在其中执行任意代码),它会引入安全漏洞。

您需要解析从文本文件读取的字符串,以便Python以结构化方式查看其内容

一种非常简单的方法是添加
[
]
,并将其视为一个结构:

import json

with open('listofquestions') as textquestions:
    questions_json = '[' + textquestions.read() + ']'
    allthequestions = json.loads(questions_json)
Python’也可以工作,但如果输入数据不可信,它可能会引入安全漏洞(它将在其中执行任意代码)。

错误

“列表”对象没有属性“strip”

出现,因为-如错误所述-您试图对类型为
list
的对象调用方法
strip
。我想你是想在列表中的
字符串上调用
strip
。无论如何,
strip
对你的问题没有帮助,我认为

一般来说:您可能应该更改保存问题数据的方式


但是,尽管如此,您仍然可以使用以下内容加载数据:

import yaml

with open('listofquestions') as f:
    data = f.read()
    questions = yaml.safe_load('[{}]'.format(data))
发生的情况是,您的文件的内容可以解释为部分YAML文件-唯一缺少的是一个左括号
[
和一个右括号
]
。我们可以在读取文件后将这些内容添加到内容中,然后将其解析为YAML内容

改进:

  • 一起使用以读取文件:
  • 使用
    yaml
    模块解析文件内容:
第一个问题在
问题[0][0]
中,三个答案在
问题[0][1]
问题[0][2]
问题[0][3]
中,正确答案在
问题[0][4]

您可以访问这些值来构建GUI,如下所示:

错误

“列表”对象没有属性“strip”

出现,因为-如错误所述-您试图对类型为
list
的对象调用方法
strip
。我想你是想在列表中的
字符串上调用
strip
。无论如何,
strip
对你的问题没有帮助,我认为

一般来说:您可能应该更改保存问题数据的方式


但是,尽管如此,您仍然可以使用以下内容加载数据:

import yaml

with open('listofquestions') as f:
    data = f.read()
    questions = yaml.safe_load('[{}]'.format(data))
发生的情况是,您的文件的内容可以解释为部分YAML文件-唯一缺少的是一个左括号
[
和一个右括号
]
。我们可以在读取文件后将这些内容添加到内容中,然后将其解析为YAML内容

改进:

  • 一起使用以读取文件:
  • 使用
    yaml
    模块解析文件内容:
第一个问题在
问题[0][0]
中,三个答案在
问题[0][1]
问题[0][2]
问题[0][3]
中,正确答案在
问题[0][4]

您可以访问这些值来构建GUI,如下所示:


您的方法有几个问题,一些编码错误,一些概念错误

这个概念的问题是: 正如我所观察到的,主要的问题是,您似乎认为将一些文本放入一个文件中,该文件是一个逗号分隔的方括号内逗号分隔的双引号文本元素序列,当使用文件句柄和
readlines()
进行读取时,将在Python程序中创建一个列表

此外,当您抱怨打印的单引号括起来的字符串时,似乎希望从文件中读取的内容打印为单独的方括号括起来的元素(可能每一个都在一行?),而不是单个字符串

首先,从文件中读取的文本不是Python列表。 Python源代码仅被解释为源代码,其中包含数字、列表、元组等语句和数据,因为它们是由Python解释器读取的

当您
open()
一个文件,然后在文件句柄上调用
readlines()
时,读取该文件的不是Python解释器。实际上,在较低的级别上,是内核以适当大小的块读取文件并将其放入内存,即
变量所指的所有问题的内存块中。
想想看:如果第一个理论是正确的,那么对文件使用
readlines()
实际上会执行任何看起来像Python命令的操作。 那么,它怎么会知道该返回什么呢?r
# read_questions.py
import pickle

questions_file = open("questions.dmp")

all_the_questions = pickle.load(questions_file)

print(all_the_questions[0])
print(all_the_questions[1])
['What would you wear to work?', 'Hoodie', 'Suit', 'Shorts', '2'] ['How would you greet a customer?', 'Hey', 'Hi', 'Hello', '0'] What would you wear to work?,Hoodie, Suit, Shorts,2 How would you greet a customer?,Hey, Hi, Hello, 0 How many years of experience do you have?,Loads, None, Some,1 Why do you want to work here?,It's fun, No money, Friend told me to,2 { "What would you wear to work?" : ["Hoodie", "Suit", "Shorts","2"] }