python数据解析(json、pickle)

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)

用于序列化的两个模块:

  • json: 用于字符串和python数据类型间进行转换
  • pickle: 用于python特有的类型和python的数据类型间进行转换

JSON、pickle两个模块有dumps、dump、loads、load四个功能

    dumps:把数据类型转换成字符串

    dump: 把数据类型转换成字符串并存储在文件中

     loads:把字符串转换成数据类型  

     load:把文件打开从字符串转换成数据类型

pickle模块

d = dict(name='bob', age=20, score=88)
print(pickle.dumps(d))#把任意对象序列化为一个bytes

输出二进制数据:

b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00bobq\x02X\x05\x00\x00\x00scoreq\x03KXX\x03\x00\x00\x00ageq\x04K\x14u.'

使用loads反序列化:

pickle_data = b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00bobq\x02X\x05\x00\x00\x00scoreq\x03KXX\x03\x00\x00\x00ageq\x04K\x14u.'
pickle_loads = pickle.loads(pickle_data)
print(type(pickle_loads))
print(pickle_loads)

输出数据:

<class 'dict'>#反序列化为字典类型
{'age': 20, 'score': 88, 'name': 'bob'}

把字典中的数据以二进制方式写入文件:

d = dict(name='bob', age=20, score=88)
with open("test.txt", mode='wb') as f:
    pickle.dump(d, f)#把序列化之后的bytes写入文件
    f.close()


读取文件中的二进制数据,并转为字典格式数据:

with open("test.txt", mode='rb') as f:
    content = pickle.load(f)
    f.close()
    print(type(content))
    print(content)

输出:

<class 'dict'>
{'score': 88, 'name': 'bob', 'age': 20}

JSON模块

d = dict(name='bob', age=20, score=88)
json_data = json.dumps(d)
print(type(json_data))
print(json_data)

输出字符串数据(pickle输出的是二进制数据):

<class 'str'>
{"score": 88, "age": 20, "name": "bob"}

使用loads把字符串转为字典对象:

json_str = '{"score": 88, "name": "bob", "age": 20}'
json_obj = json.loads(json_str)
print(type(json_obj))
print(json_obj)

输出字典对象:

<class 'dict'>
{'age': 20, 'name': 'bob', 'score': 88}

使用dump把字典对象写入文件中:

d = dict(name='bob', age=20, score=88)
with open("test.txt", mode='w') as f:
    json.dump(d, f)
    f.close()

文件中内容:


使用load加载文件中的数据:

with open("test.txt", mode='r') as f:
    content = json.load(f)
    f.close()
    print(type(content))
    print(content)

输出字典类型数据:

<class 'dict'>
{'name': 'bob', 'score': 88, 'age': 20}

把对象转为json字符串:

class Student(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

stu = Student(name='test', age=29)

def student2dic(std):
    return {
        'name': std.name,
        'age': std.age
    }

data = json.dumps(stu, default=student2dic)
print(type(data))
print(data)

输出:

<class 'str'>
{"name": "test", "age": 29}

简单方法:

data = json.dumps(stu, default=lambda obj:obj.__dict__)
print(type(data))
print(data)

输出:

<class 'str'>
{"age": 29, "name": "test"}

把json字符串转为对象:

class Student(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

json_str = '{"age": 29, "name": "test"}'
def dic2student(d):
    return Student(d['name'], d['age'])
data = json.loads(json_str, object_hook=dic2student)
print(type(data))
print(data)

输出:

<class '__main__.Student'>
<__main__.Student object at 0x000001CAF6C0E6A0>

简单方式:

json_str = '{"age": 29, "name": "test"}'
stu = json.loads(json_str, object_hook=lambda d:Student(d['name'], d['age']))
print(stu.name)
print(stu.age)

输出:

test
29

python的pickle模块实现了python的所有数据序列和反序列化。基本上功能使用和JSON模块没有太大区别,方法也同样是dumps/dump和loads/load。cPickle是pickle模块的C语言编译版本相对速度更快。

与JSON不同的是pickle不是用于多种语言间的数据传输,它仅作为python对象的持久化或者python程序间进行互相传输对象的方法,因此它支持了python所有的数据类型


json中的几个参数详解:

sort_keys:排序

 
json_data = {'b': 'cc', 'ac': 'bb', 'aa': 'aa'}
print(json.dumps(json_data, sort_keys=True))

输出

{"aa": "aa", "ac": "bb", "b": "cc"}
indent:缩进参数
json_data = {'b': 'cc', 'ac': 'bb', 'aa': 'aa'}
print(json.dumps(json_data, sort_keys=True, indent=4))
{
    "aa": "aa",
    "ac": "bb",
    "b": "cc"
}
ensure_ascii:True/False,默认True, 是否以ascii码返回
json_data = {'b': '中国', 'ac': '首都', 'aa': '北京'}
print(json.dumps(json_data, sort_keys=True, indent=4, ensure_ascii=True))

输出:

{
    "aa": "\u5317\u4eac",
    "ac": "\u9996\u90fd",
    "b": "\u4e2d\u56fd"
}
json_data = {'b': '中国', 'ac': '首都', 'aa': '北京'}
print(json.dumps(json_data, sort_keys=True, indent=4, ensure_ascii=False))

输出:

{
    "aa": "北京",
    "ac": "首都",
    "b": "中国"
}
separators:压缩,缩进
json_data = {'b': '中国', 'ac': '首都', 'aa': '北京'}
print(json.dumps(json_data, separators=(',', ':'), ensure_ascii=False))
print(json_data)

输出:

{"b":"中国","aa":"北京","ac":"首都"}
{'b': '中国', 'aa': '北京', 'ac': '首都'}
separators = (',', ':')格式应该是固定的,如果写成separators=(':', ',')

json_data = {'b': '中国', 'ac': '首都', 'aa': '北京'}
print(json.dumps(json_data, separators=(':', ','), ensure_ascii=False))
print(json_data)

输出:

{"b","中国":"aa","北京":"ac","首都"}
{'b': '中国', 'aa': '北京', 'ac': '首都'}

如有不对地方,请指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值