json 模块 2018/5/31
[TOC]
今日问题
- 我希望达成的目的是:将json文件里面存储的字典内容,读取出来,转化成字符串的形式,方便提取里面的元素——因此,我想到json下面的dumps是用于将dict类型的数据,转化成str数据的一个操作方式;所以,就使用了这个方法:
代码如下:
import json
f = open('1234.json', 'r+')
data = f.read()
print(data)
j_data = json.dumps(data)
print(j_data)
输出结果为:
问题:我这里把文件中的字典类型 json了之后,为什么打印结果有 这个符号?
解决:我最开始提出的问题是:为什么我按照我上面的思路(把json文件里面的dict数据提取出来,转化成str形式),并且打印出来后,电脑会在我的字典内容之外,还加入了 这个符号。也就是这个样子。
- 最后,我理解了:
- 是因为我错误的使用了dumps,这个操作是将dict转化成str后,存入文件,而不是把json文件里面的东西取出来,转化成str的操作方式;
- 那,为什么会出现 这个符号呢? 我现在的想法是:应该是系统的某种操作,为了让dict数据类型转化成str后能够,存入json文件的一个方式,具体为什么会加入 ,也许就是开发者的一个设计吧。
Json模块的dumps、loads、dump、load函数介绍
json.dumps()
json.dumps()用于将dict类型的数据转成str,因为如果直接将dict类型的数据直接写入json文件中会发生报错,因此在将数据写入的时候需要用到该函数。
import json
name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}
jsObj = json.dumps(name_emb)
print(name_emb)
print(jsObj)
print(type(name_emb))
print(type(jsObj))
运行的结果如下:
{'a': '1111', 'c': '3333', 'b': '2222', 'd': '4444'}
{"a": "1111", "c": "3333", "b": "2222", "d": "4444"}
<type 'dict'>
<type 'str'>
json.loads()
json.loads()用于将str类型的数据转成dict。
import json
name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}
jsDumps = json.dumps(name_emb)
jsLoads = json.loads(jsDumps)
print(name_emb)
print(jsDumps)
print(jsLoads)
print(type(name_emb))
print(type(jsDumps))
print(type(jsLoads))
运行结果如下:('a'变成了u'a'是因为发生了类型转换,str会转换成unicode)
{'a': '1111', 'c': '3333', 'b': '2222', 'd': '4444'}
{"a": "1111", "c": "3333", "b": "2222", "d": "4444"}
{u'a': u'1111', u'c': u'3333', u'b': u'2222', u'd': u'4444'}
<type 'dict'>
<type 'str'>
<type 'dict'>
json.dump()
jsom.jump()用于将dict类型的数据转换成str,并写入到json文件中。下面两种方法都可以将数据写入json文件
import json
name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}
emb_filename = ('/home/cqh/faceData/emb_json.json')
# solution 1
jsObj = json.dumps(name_emb)
with open(emb_filename, "w") as f:
f.write(jsObj)
f.close()
# solution 2
json.dump(name_emb, open(emb_filename, "w"))
json.load()
json.load()用于从json文件中读取数据。
import json
emb_filename = ('/home/cqh/faceData/emb_json.json')
jsObj = json.load(open(emb_filename))
print(jsObj)
print(type(jsObj))
for key in jsObj.keys():
print('key: %s value: %s' % (key,jsObj.get(key)))
运行结果如下:
{u'a': u'1111', u'c': u'3333', u'b': u'2222', u'd': u'4444'}
<type 'dict'>
key: a value: 1111
key: c value: 3333
key: b value: 2222
key: d value: 4444
注意:json中必须使用双引号~!!!