我有这段代码将raw_input写入file:
import json
a = raw_input("time meds taken?: format '@12:00' ")
b = raw_input("had food at that point?: format '#0/1' ")
ax = {"meds": a}
bx = {"food": b}
with open("chance1.json", "a") as f:
json.dump([ax, bx], f)
f.close()
然后我最终得到了这个:
[{"meds": "11:00"}, {"food": "0"}, {"meds": "12:45"}, {"food": "0"}, {"meds": "10:45"}, {"food": "0"}]
然后我需要将上面的数据导入sqlite浏览器。我目前正在使用以下代码:
import json
import sqlite3
conn = sqlite3.connect ('meds.sqlite')
cur = conn.cursor()
cur.executescript('''
DROP TABLE IF EXISTS Meds;
DROP TABLE IF EXISTS Food;
CREATE TABLE Meds (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
time TEXT UNIQUE
);
CREATE TABLE Food (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
meds_id INTEGER,
status TEXT UNIQUE
);
''')
fname = raw_input('Enter file name: ')
if ( len(fname) < 1 ) : fname = 'chance1.json'
str_data = open(fname).read()
json_data = json.loads(str_data)
for entry in json_data:
time = entry["meds"]
status = entry["food"]
print time, status'
然而,我最终得到了追溯KeyError: "food"
。有什么建议怎么解决这个问题,好吗?请注意代码没有完成,因为我无法超越这一部分! (文件也有可能是Unicode,因为当我打印条目时,我会在每个条目之前得到'u'。)
答案 0 :(得分:1)
您的大多数帖子都与KeyError
无关。您要求字典中存在不存在的内容,即与键'food'
关联的值。
一种解决方案是使用dict.get
,如果找不到密钥,则返回None:
status = entry.get('food')
# status will be None if there is no 'food' key
您还可以将get
与默认值一起使用:
status = entry.get('food', 123)
另一种可能性是缺少一个键表示应用程序中的错误。在这种情况下,您需要考虑没有'food'
密钥的原因。
目前,您将'food'
和'meds'
信息存储在单独的词典中,然后将它们组合在一个列表中。也许您想要以下内容:
data = {"meds": a, "food": b}
with open("chance1.json", "a") as f:
json.dump(data, f)
将食物和药物信息放在同一个字典中。请注意,使用模式'a'
打开文件意味着新数据将附加到现有文件。如果要附加到存储为json的现有列表,则需要读取现有数据,解析它,将新项添加到列表中,然后重新写入文件。
检查你的json文件,它看起来像你期望的那样吗?