我想将三个词典作为对象数组一个一个地保存到一个json文件中。
导入 json
milk = {'产品':'牛奶',
'卡路里':100,
}
面包= {'产品':'面包',
'卡路里':200,
}
fish = {'产品':'鱼',
'卡路里':300,
}
def add_food_to_database(食物):
path = '/home/dzmitry/foods.json'
打开(路径,'r+')作为 jsonfile:
如果不是 jsonfile.read():
数据 = []
数据追加(食物)
json.dump(数据,jsonfile)
别的:
jsonfile.seek(0)
数据 = json.load(jsonfile)
数据追加(食物)
json.dump(数据,jsonfile)
print("添加的产品:", food['Product'])
食物 =(牛奶、面包、鱼)
[add_food_to_database(food) for foods in foods]
但是,由于某种原因,只添加了两个产品。
=========== 重启:/home/dzmitry/forstack.py ===========
添加的产品:牛奶
添加的产品:面包
追溯(最近一次通话):
文件“/home/dzmitry/forstack.py”,第 28 行,位于
[add_food_to_database(food) for foods in foods]
文件“/home/dzmitry/forstack.py”,第 28 行,位于
[add_food_to_database(food) for foods in foods]
文件“/home/dzmitry/forstack.py”,第 22 行,在 add_food_to_database 中
数据 = json.load(jsonfile)
加载文件“/usr/lib/python3.5/json/__init__.py”,第 268 行
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
加载文件“/usr/lib/python3.5/json/__init__.py”,第 319 行
返回 _default_decoder.decode(s)
文件“/usr/lib/python3.5/json/decoder.py”,第 342 行,解码
提高 JSONDecodeError(“额外数据”,s,结束)
json.decoder.JSONDecodeError:额外数据:第 1 行第 140 列(字符 139)
>>>
我究竟做错了什么?
json.load()从文件中读取,因此当您调用json.dump()它时会写入末尾 - 导致内容无效。例如,如果文件包含[1]列表 和food = 2,则json.dump()内容将变为[1][1,2],这不是 JSON 列表。最小变化:添加
jsonfile.seek(0)之前json.dump()(正在写入的内容较大,所以没有必要jsonfile.truncate(0)或类似调用删除之前的内容)。您可以将单个对象保存到文件中,而不是 JSON 列表——每行一个。然后,我们可以简化
add_food_to_database()功能:json.dumps()不包含换行符(未转义\n在 JSON 字符串中被禁止并且默认情况下json.dumps()不用于'\n'格式化 -separators在示例中明确传递以便不依赖于默认值)。回读:
或者(如果你想像对待数据库一样对待文件)你可以使用 sqlite 来保存记录:
该示例假定
food = {'product': 'Молоко', 'calories': 100}or 相似,并foods.db包含一个使用以下方法创建的表: