尝试解析列表中的json字典以创建sqlite数据库

时间:2016-04-15 12:54:25

标签: python json sqlite dictionary unicode

我有这段代码将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'。)

1 个答案:

答案 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文件,它看起来像你期望的那样吗?