2016-04-15 39 views
1

我有这样的代码来的raw_input写入文件:尝试解析列表中的JSON字典创建SQLite数据库

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

尝试在您的循环中打印条目 – Benjamin

+0

当我在循环中打印条目时,我得到: {u'meds':u'11:00'}等等每个条目 – NamedN

回答

1

您的大部分帖子都与KeyError无关。您正在查询词典中不存在的内容,即与密钥'food'相关联的值。

一种解决方案是使用dict.get,它返回无如果键无法找到:

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