我有一个data.json文件,看起来像这样:
["{\"Day\":\"Today\",\"Event\":\"1\", \"Date\":\"2019-03-20\"}"]
我正在尝试使用python从此文件中获取“事件”,但失败了。
with open('data.json', 'r') as json_file:
data = json.load(json_file)
print (data['Event'])
我收到以下错误:
TypeError:列表索引必须是整数或切片,而不是str
即使我尝试
print (data[0]['Event'])
然后我收到此错误:
TypeError:字符串索引必须为整数
还有一件事:
print(type(data))
给我“列表”
我到处搜索,但没有找到解决方案。非常感谢您的建议。
答案 0 :(得分:2)
您可以为此使用ast
模块:
import ast
mydata = ["{\"Day\":\"Today\",\"Event\":\"1\", \"Date\":\"2019-03-20\"}"]
data = ast.literal_eval(mydata[0])
data
{'Day': 'Today', 'Event': '1', 'Date': '2019-03-20'}
data['Event']
'1'
您的原始代码确实将数据加载到列表结构中,但是尽管使用了正确的json语法,但列表中仅包含一个字符串条目。 ast
与json
一样,将把该字符串条目解析为python数据结构dict
。
就目前而言,当您尝试为该列表建立索引时,它与在字典中调用键是不同的,因此slices cannot be str
:
alist = [{'a':1, 'b':2, 'c':3}]
alist['a']
TypeError
# need to grab the dict entry from the list
adict = alist[0]
adict['a']
1
答案 1 :(得分:1)
您需要使用json模块将数据中的元素转换为dict。
例如:
import json
with open(filename) as infile:
data = json.load(infile)
for d in data:
print(json.loads(d)['Event'])
或:
data = list(map(json.loads, data))
print(data[0]["Event"])
输出:
1
答案 2 :(得分:1)
您的问题是您将其解析为包含单个元素(字符串)的列表。
["{\"Day\":\"Today\",\"Event\":\"1\", \"Date\":\"2019-03-20\"}"]
看看列表的整个内容如何在两边都被"
包围,而每隔"
前面都带有\
?通常,斜杠表示忽略以下字符可能具有的特殊含义,而是将其解释为纯字符串。
如果您可以控制文件的内容,则最简单的解决方案是对其进行调整。您将希望它采用以下格式:
[{"Day":"Today", "Event": "1", "Date": "2019-03-20"}]
编辑:正如其他人所建议的那样,您也可以将其解析为当前状态。当然,清理数据很繁琐,但通常值得付出努力。尽管这可能不是其中一种情况。无论如何,我还是不回答这个问题,因为这可能有助于解释为什么OP最初的尝试不起作用,以及为什么他收到他收到的错误消息。