【问题标题】:How to add a key-value pair in dictionary for dumping data in JSON format in python?如何在字典中添加键值对以在 python 中以 JSON 格式转储数据?
【发布时间】:2014-01-31 12:55:50
【问题描述】:

我想将一个键值对添加到具有一些键值对的现有数组中,然后以 JSON 格式转储此信息。

我尝试了以下代码:

import json

student_data = [{'stu_name':'name','id no':7}]

if result is 1:    
    student_data['result'] = 'pass'
else:
    student_data['result'] = 'fail'

if school is 1:
   student_data['school'] = 'secondary school'
else:
   student_data['school'] = 'primary school'

with open(file.json, "w") as f:
    json.dump(student_data, f)

但是这段代码在"student_data['result'] = 'pass'行中给了我错误

我尝试从student_data = [{'stu_name':'name','id no':7}] 中删除[]

但是只有键被打印在文件中,没有值。

我该如何纠正这个问题?

【问题讨论】:

  • student_data 不是字典,而是列表。

标签: python json


【解决方案1】:

如果您将 student_data 更改为字典,那么您可以尝试这样的方法来更新字典。您从 student_data 中删除 [] 因此,它将更改为 dict 对象。

>>> student_data = {'stu_name':'name','id no':7}
>>> student_data.update({'result':'pass'})
>>> student_data
{'stu_name': 'name', 'id no': 7, 'result': 'pass'}
>>>

或者你可以分配它:

>>> student_data = {'stu_name':'name','id no':7}
>>> student_data['result'] = 'pass'
>>> student_data
{'stu_name': 'name', 'id no': 7, 'result': 'pass'}
>>>

【讨论】:

  • dict.update() 对于一个键值对来说有点矫枉过正;简单的项目分配就可以了。当您可以使用专用的字节码指令代替时,为什么要为属性查找和堆栈推送付出代价?
  • @MartijnPieters 如果不能像你一样一次性声明整个字典,我会使用update。在这种情况下,真正的代码不仅会添加一个键,还会添加"school"
  • @nmclean:当然可以,但是我看到太多新用户使用.update()(多次!)一次添加一个键值对。考虑到这里的答案将被更多人阅读,而不仅仅是这一篇 OP。
【解决方案2】:

您有一个带有字典的列表。要么使用索引:

student_data[0]['result'] = 'pass'

或者添加列表稍后,写的时候:

student_data = {'stu_name':'name','id no':7}

# ...

with open(file.json, "w") as f:
    json.dump([student_data], f)

注意:当您应该测试相等性时,不要对整数使用恒等测试。仅仅因为 CPython 发生 用于实习小整数,使用 is 1 并不是一个好主意。请改用== 1

student_data = {'stu_name':'name','id no':7}

student_data['result'] = 'pass' if result == 1 else 'fail'
student_data['school'] = 'secondary school' if school == 1 else 'primary school'

with open(file.json, "w") as f:
    json.dump([student_data], f)

在上面的例子中,我使用conditional expressions 来设置resultschool 键;您也可以直接在字典文字中使用它们:

student_data = [{'stu_name': 'name', 'id no':7,
                 'result': 'pass' if result == 1 else 'fail',
                 'school': 'secondary school' if school == 1 else 'primary school',
                }]

with open(file.json, "w") as f:
    json.dump(student_data, f)

【讨论】:

  • 您的解决方案有效,但键未按字典顺序打印,“id_no”在“stu_name”之前打印
  • @user3181411:字典没有固定的顺序,JSON 对象也是如此。换句话说:您不能依赖保存密钥的顺序。您可以要求json.dumps() 先对键进行排序,但任何加载 JSON 数据的操作也可以随意忽略顺序。
  • @user3181411:换句话说,你看到的是完全正常。代码按预期工作。
  • 但我希望在文件中按顺序打印密钥。该怎么做?
  • @user3181411:为什么您希望订购它们? JSON 标准规定对象中的键({...} 语法)没有顺序,读取文件的任何内容都不会遵守顺序。
猜你喜欢
  • 2021-05-11
  • 1970-01-01
  • 2021-03-14
  • 2018-02-02
  • 2020-02-16
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
相关资源
最近更新 更多