js string转json有斜杠_三十、深入Python中的Pickle和Json模块

news/2024/7/7 9:03:51

eee1c286509319f56feffdb81d72c67d.png

「@Author:Runsen」

听过Python序列化pickle和Json标准库吗?

pickle

pickle模块是以二进制的形式序列化后保存到文件中(保存文件的后缀为".pkl"),不能直接打开进行预览。而python的另一个序列化标准模块 json,可以直接打开查看(例如在notepad++中查看)。

pickle模块实现了基本的数据序列化和反序列化。

所谓的序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程,比如数据转成文本。

就是将数据结构转化成你看不懂的东西。相反的,从序列化的格式中解析对象状态的过程被称为“反序列化”。

pickle提供四个功能:dumps,dump,loads,load,  和json差不多。

dump和dumps

序列化的方法为 pickle.dump()和pickle.dumps()。

dump该方法的相关参数如下:

pickle.dump(obj, file, protocol=None,*,fix_imports=True)

该方法实现的是将序列化后的对象obj以二进制形式写入文件file中,进行保存。

pickle.dumps()方法的参数如下:

pickle.dumps(obj, protocol=None,*,fix_imports=True)

pickle.dumps()方法跟 pickle.dump()方法的区别在于,pickle.dumps()方法不需要写入文件中,它是直接返回一个序列化的bytes对象。

下面具体一个具体示例。

>>> import pickle
>>> data = [{'a': 'A', 'b': 2, 'c': 2.22}]
>>> # 使用 pickle.dumps() 可以将一个对象转换为二进制字符串(dump string):
>>> data_string = pickle.dumps(data)
>>> data
[{'a': 'A', 'b': 2, 'c': 2.22}]
>>>b'\x80\x03]q\x00}q\x01(X\x01\x00\x00\x00aq\x02X\x01\x00\x00\x00Aq\x03X\x01\x00\x00\x00bq\x04K\x02X\x01\x00\x00\x00cq\x05G@\x01\xc2\x8f\\(\xf5\xc3ua.'

dumps 可以接受一个可省略的 protocol 参数(默认为 0),protocol参数不同,表示进行的编码协议不同,得到的data_string也不同。

如果 protocol 参数指定为负数,那么将调用当前的最高级的编码协议进行编码

>>> data_string_1 = pickle.dumps(data, 1)
>>> data_string_1
b']q\x00}q\x01(X\x01\x00\x00\x00aq\x02X\x01\x00\x00\x00Aq\x03X\x01\x00\x00\x00bq\x04K\x02X\x01\x00\x00\x00cq\x05G@\x01\xc2\x8f\\(\xf5\xc3ua.'
>>> data_string__1 = pickle.dumps(data, -1)
>>> data_string__1
b'\x80\x04\x95#\x00\x00\x00\x00\x00\x00\x00]\x94}\x94(\x8c\x01a\x94\x8c\x01A\x94\x8c\x01b\x94K\x02\x8c\x01c\x94G@\x01\xc2\x8f\\(\xf5\xc3ua.'

如果需要保存为data.pkl,可以使用dump方法,具体代码如下。

import pickle
with open('data.pkl', 'wb') as f:
    pickle.dump(data, f)

load和loads

现在给你这个data_string 你能知道这是啥吗?

虽然 pickle 编码的字符串并不一定可读,但是我们可以用 pickle.loads() 来从这个字符串中恢复原对象中的内容(load string)。也就是dumpsloads 有相反的作用。

pickle.loads()方法的参数如下:

pickle.loads(bytesobject, *,fiximports=True, encoding="ASCII". errors="strict")

>>> # pickle.loads() 来从这个字符串中恢复原对象中的内容(load string):
>>> pickle.loads(data_string)
[{'a': 'A', 'b': 2, 'c': 2.22}]

如果指定了protocol参数,需要这些格式中恢复对象时,不需要指定所用的协议,pickle.load() 会自动识别:

>>> pickle.loads(data_string_1)
[{'a': 'A', 'b': 2, 'c': 2.22}]
>>> pickle.loads(data_string__1)
[{'a': 'A', 'b': 2, 'c': 2.22}]

反序列化的方法还有 pickle.load(),该方法的相关参数如下:

pickle.load(file, *,fix_imports=True, encoding="ASCII". errors="strict")

如果使用load,需要读取data.pkl文件。

pkl_file = open('data.pkl', 'rb')
print(pickle.load(pkl_file))

pickle.loads()方法跟 pickle.load()方法的区别在于, pickle.loads()方法是直接从bytes对象中读取序列化的信息,而非从文件中读取。

Json

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。

它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

「JS对象」

var student = {
    name: ‘Runsen’,
    age: 18,
    feature : [‘高’, ‘富’,  ‘帅’]
}

「JSON字符串」

{
    “name”: “Runsen”,
    “age”: 18,
    “ feature “ : [‘高’, ‘富’,  ‘帅’]
}

「Python字典」

{
    ‘name’: ‘Runsen’,
    ‘age’: 18
    ‘feature’ : [‘高’, ‘富’,  ‘帅’]
}

注意点:Json字符串必须用双引号(即:””)来包括, 值可以是字符串、数字、true、false、null、列表,或字典。Python字典可以用单引号,也可以用双引号。

常用json就知道,json和pickle完全一样,json模块也提供了四个常用的方法:dumps、dump、loads、load,用于字符串 和 python数据类型间进行转换。

APi描述
json.dumps(obj)将python数据转化为json
json.loads(s)将json数据转换为python的数据
json.dump(obj, fp)转换为json并保存到文件中
json.load(fp)从文件中读取json,并转化为python数据

API的使用

import json
my_dict = {'a':'1','b':'2','c':'3','d':'4'}
print(type(my_dict))
a = json.dumps(my_dict)
print(a)
print(type(a))
b=json.loads(a)
print(b)
print(type(b))

# 输出如下
<class 'dict'>
{"a": "1", "b": "2", "c": "3", "d": "4"}
<class 'str'> #json的字符串
{'a': '1', 'b': '2', 'c': '3', 'd': '4'}
<class 'dict'>
——————————
>>> import json
>>> print (json.dumps('中国'))
"\u4e2d\u56fd"
>>> # 这里有一个ensure_ascii参数,表示是否用ascii解析
>>> print(json.dumps('中国', ensure_ascii=False))
"中国"
——————————
#json.dump() 和 json.load() 来编码和解码JSON数据,用于处理文件。import jsonmy_dict = {'a':'1','b':'2','c':'3','d':'4'}
json.dump(my_dict,open('a.txt','w'))
print(json.load(open('a.txt','r')))

# 输出如下
会生成一个“a.txt"文件
{'a': '1', 'b': '2', 'c': '3', 'd': '4'}

本文已收录 GitHub,传送门~[1] ,里面更有大厂面试完整考点,欢迎 Star。

Reference

[1]

传送门~: https://github.com/MaoliRUNsen/runsenlearnpy100

更多的文章

点击下面小程序

9c311979a00f0c6bebe92ce97016136c.png

- END -

5a82734ebea73faf26aca80333bb8270.png


http://www.niftyadmin.cn/n/2642660.html

相关文章

高通820A在5G时代来临的表现

在2019年新春CES展&#xff0c;手机界酝酿着一场大变革&#xff0c;即5G通信时代的到来。说到5G技术&#xff0c;可不仅仅只用在手机上&#xff0c;5G通信可以联络到任务网络设备&#xff0c;主要是以传输数据的速度快&#xff0c;会让消费者们体验前所未有的改变&#xff0c;得…

Android IPC机制(三)使用AIDL实现跨进程方法调用

上一篇文章中我们介绍了使用Messenger来进行进程间通信的方法&#xff0c;但是我们能发现Messenger是以串行的方式来处理客户端发来的信息&#xff0c;如果有大量的消息发到服务端&#xff0c;服务端仍然一个一个的处理再响应客户端显然是不合适的。另外&#xff0c;Messenger用…

骁龙 820A芯片机器学习方案介绍

高通公司推出了多项计划以进一步推动智能互联汽车领域的发展&#xff0c;包括使用高通Snapdragon 820A为下一代大众信息娱乐系统提供动力&#xff0c;宣布在德国进行Cellular V2X试验&#xff0c;揭示出一种新的高端带宽千兆LTE用于车辆&#xff0c;并演示Snapdragon 820A如何为…

cocosc++怎么打印_VS2010-win32下cocos2dx控制台打印的方法

在xcode中 直接使用printf 或者 cout<但是在VS2010 却死活不好用 真郁闷-----------------10-9更新----------------下面的代码在 自己建立的项目里都已经存在啦AllocConsole(); freopen("CONIN$", "r", stdin); freopen("CONOUT$", "…

复联4里用到的方法论

引子 为了不剧透&#xff0c;我忍了很久才写这篇文章。直到现在复联4的免费在线观看版在网上都可以搜到了。所以介于漫威系列电影里很多方面和互联网的共性&#xff0c;今天说说自己的看法。 漫威系列得到了很多工程师的喜爱&#xff0c;除了编剧选演员日久弥新的审美观这个必…

Maven the definitive guide.pdf

http://vdisk.weibo.com/s/yW8b4aInnvTwk

git tag本地删除以及远程删除

假设存在tag:12345 git tag -d 12345 #删除本地记录 git push origin :refs/tags/12345 #删除远程记录PS: 如果您觉得我的文章对您有帮助&#xff0c;请关注我的微信公众号&#xff0c;谢谢!

pytorch训练lstm_Pytorch-RNNBASE-LSTM python+c源码理解

实验室要做一个语义相似度判别的项目&#xff0c;分给了我这个本科菜鸡&#xff0c;目前准备使用LSTM做一个Baseline来评价其它的方法&#xff0c;但是卡在了pytorch的LSTM模块使用上&#xff0c;一是感觉这个模块的抽象程度太高&#xff0c;完全封装了所有内部结构的情况下使得…