文章目录
json文件处理
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,其最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式。
什么是json
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON支持数据格式
- 对象(字典)。使用花括号。
- 数组(列表)。使用方括号。
- 整形、浮点型、布尔类型还有null类型。
- 字符串类型(字符串必须要用双引号,不能用单引号)。
多个数据之间使用逗号分开。
注意:json本质上就是一个字符串。
json.dumps()
和 json.loads()
函数
json 模块提供了一种很简单的方式来编码和解码JSON数据。 其中两个主要的函数是 json.dumps()
和 json.loads()
。
def dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
default=None, sort_keys=False, **kw):
-
json.dumps(str, indent=4, sort_keys=True)
将一个python数据对象转换成一个json字符串
sort_keys
:是否按字典排序(a到z)输出。因为默认编码成json格式字符串后,是紧凑输出,并且也没有顺序的,不利于可读。
indent:格式化输出json数据,呈现更直观。indent=4表示缩进4个空格
sort_keys:json字符串按照字典的key进行排序import json data = { 'name' : 'ACME', 'shares' : 100, 'price' : 542.23 } with open("hu",'w') as f_write: json_str = json.dumps(data) f_write.write(json_str)
-
indent
:设置参数缩进显示的空格数。缩进显示使读起来更加清晰。import json data = { 'name' : 'ACME', 'shares' : 100, 'price' : 542.23 } with open("hu",'w') as f_write: json_str = json.dumps(data,indent=4) f_write.write(json_str)
-
separators
:参数的作用是去掉,
和:
后面的空格,从上面的输出结果都能看到”,
:
”后面都有个空格,这都是为了美化输出结果的作用,但是在我们传输数据的过程中,越精简越好,冗余的东西全部去掉,因此就可以加上separators参数。>>> print len(json.dumps(data)) 35 >>> print len(json.dumps(data, separators=(',',':'))) 29
-
skipkeys
:在encoding过程中,dict对象的key只可以是基本数据类型(str,unicode,int,long,float,bool,None),如果是其他类型,那么在编码过程中就会抛出ValueError的异常。skipkeys可以跳过那些非string对象的key的处理,就是不处理。>>> data= [ { 'a':'A', 'b':(2, 4), 'c':3.0, (1,2):'D tuple' } ] >>> print json.dumps(data) #skipkeys参数默认为False时 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python27\lib\json\__init__.py", line 243, in dumps return _default_encoder.encode(obj) File "C:\Python27\lib\json\encoder.py", line 207, in encode chunks = self.iterencode(o, _one_shot=True) File "C:\Python27\lib\json\encoder.py", line 270, in iterencode return _iterencode(o, 0) TypeError: keys must be a string >>> print json.dumps(data, skipkeys=True)# skipkeys=True时 [{"a": "A", "c": 3.0, "b": [2, 4]}]
-
ensure_ascii
:表示编码使用的字符集,默认是是True,表示使用ascii码进行编码。如果设置为False,就会以Unicode进行编码。由于解码json字符串时返回的就是Unicode字符串,所以可以直接操作Unicode字符,然后直接编码Unicode字符串,这样会简单些。import json books = [ { 'title': '钢铁是怎样练成的', 'price': 9.8 }, { 'title': '红楼梦', 'price': 9.9 } ] json_str = json.dumps(books,ensure_ascii=False) print(json_str)
因为json在dump的时候,只能存放ascii的字符,因此会将中文进行转义,这时候我们可以使用ensure_ascii=False关闭这个特性。
在Python中。只有基本数据类型才能转换成JSON格式的字符串。也即:int、float、str、list、dict、tuple。
将json数据直接dump到文件中
json模块中除了dumps函数,还有一个dump函数,这个函数可以传入一个文件指针,直接将字符串dump到文件中。
def dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
default=None, sort_keys=False, **kw):
'''
Serialize ``obj`` as a JSON formatted stream to ``fp`` (a
``.write()``-supporting file-like object).
'''
books = [
{
'title': '钢铁是怎样练成的',
'price': 9.8
},
{
'title': '红楼梦',
'price': 9.9
}
]
with open('a.json','w') as fp:
json.dump(books,fp)
将一个json字符串load成Python对象
json.loads()
将一个json字符串转换成python对象,比如json字符串转换成列表、字典
import json
json_str = '[{"username": "张三", "age": 18, "country": "china"}, {"username": "李赛", "age": 20, "country": "china"}]'
persons = json.loads(json_str)
print(type(persons))
for person in persons:
print(person)
直接从文件中读取json:
with open('person.json','r',encoding='utf-8') as fp:
persons = json.load(fp)
print(type(persons))
for person in persons:
print(person)