Python中的字典,json模块,eval 说到python中的字典真的和json数据很类似,且json被绝大部分各类开发者所使用,而eval和这2者什么关系,下面是我的总结
DICT字典 VS Json dcit
,是python中字典数据类型,有了dict可以很方便的对结构化解析数据,有点像最小化的关系型数据库,是key对于value比如
1 a = {'name' : '兔纸' , 'class' : 'One' }
json
,是数据交换格式,JSON语法是JavaScript对象表示语法的子集,规范是:数据在键值对中,数据由逗号分隔,花括号保存对象,方括号保存数组,且必须要用双引号包裹字符串
,这是官方的说明 其中有一段是”A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. A character is represented as a single character string. A string is very much like a C or Java string.” 本文总结只是涉及python 中dict和json的区别以及转换相关
1 a = {"name" : "兔纸" , "class" : "One" }
我们看看区别(To Do)
json
python-dict
只能用双引号包裹字符串
单引号和双引号都可以包裹字符串
json 可以是这样子[{“name”:x},{“age”:2}]
在python中[{“name”:x},{“age”:2}] 叫列表里面有2个字典的元素
如果python中的字典中都是用双引号来包裹字符串的,json才可以解析
python 可以把json数据直接当成字典或者列表使用
所谓的python的dict和json相互操作转换 python中把字典转换从json格式或者相互操作,这是伪命题:因为python可以直接把json数据拿来用的,那转个毛呢? 比如:我们把{“name”:x},{“age”:2} 这种数据需要写入到文件且要保证这种数据格式,我们希望下次读取可以直接当成字典来用 首先要把这个数据变成字符串然后写到文件中,读取的时候{“name”:x},{“age”:2} 就变成了一个字符串,我们需要把这个数据格式化为字典格式来用 又比如:我们调用外包http接口,对方吐出的json格式数据,但是http 去读取回来 也是一个字符串,我们同样想办法转成字典来操作 这时候就需要python 的默认lib库json,因为json数据格式 python可以直接拿来当字典用,其实是json格式数据和字符串相互转换
一般是用python的lib json,在python2.4中这个模块叫simplejson
这里拿json模块来举例
1 2 3 4 5 6 7 8 9 10 11 12 import jsonprint([ i for i in dir(json) if not i.startswith('_' )]) ['JSONDecoder' , 'JSONEncoder' , 'decoder' , 'dump' , 'dumps' , 'encoder' , 'load' , 'loads' , 'scanner' ] a = '{"name":"Seal","age":99}' x = json.loads(a) type(x) dict b = {"name" :"Seal" ,"age" :99 } y = json.dumps(b) type(y) str
那python中字典同样可以用单引号的,这个时候则么办呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 import jsona = "{'name':'Seal','age':99}" x = json.loads(a) ''' ValueError Traceback (most recent call last) <ipython-input-23-6bb448117314> in <module>() ----> 1 x = json.loads(a) /usr/lib64/python2.7/json/__init__.pyc in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw) 336 parse_int is None and parse_float is None and 337 parse_constant is None and object_pairs_hook is None and not kw): --> 338 return _default_decoder.decode(s) 339 if cls is None: 340 cls = JSONDecoder /usr/lib64/python2.7/json/decoder.pyc in decode(self, s, _w) 363 364 """ --> 365 obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 366 end = _w(s, end).end() 367 if end != len(s): /usr/lib64/python2.7/json/decoder.pyc in raw_decode(self, s, idx) 379 """ 380 try: --> 381 obj, end = self.scan_once(s, idx) 382 except StopIteration: 383 raise ValueError("No JSON object could be decoded") ValueError: Expecting property name: line 1 column 2 (char 1) No JSON object could be decoded 这说明的很明白,没有找到JSON的对象,因为用了单引号 并不是json格式数据了,当然就不能使用json的这个方法了 ''' ''' 这时候eval出场了,eval是一个把你输入的字符串进行表达的函数,且还有2个参数是global 和local 全局是局部的属性 说简单点你输入是什么就返回的什么,比如 a="1+2" eval(a) 输出不是"1+2" 而是3, eval()表达了1+2.在python中1+2 是数学运算所以输出是3,None和布尔是不能用eval()来表达了, 当然比如 a=' ' ,或者 a= '\n' 这种也同样不能被表达, eval()能做的还有很多,这里不做展开了.有兴趣可以自己度娘一下 "eval()不安全" ''' a = "{'name':'Seal','age':99}" y = eval(a) type(t) dict