python如何根据字典进⾏⽂本内容替换_从零开始学Python-第
024课:对象的序列化。。。
读写JSON格式的数据
通过上⾯的讲解,我们已经知道如何将⽂本数据和⼆进制数据保存到⽂件中,那么这⾥还有⼀个问题,如果希望把⼀个列表或者⼀个字典中的数据保存到⽂件中⼜该怎么做呢?在Python中,我们可以将程序中的数据以JSON格式进⾏保存。JSON是“JavaScript Object Notation”的缩写,它本来是JavaScript语⾔中创建对象的⼀种字⾯量语法,现在已经被⼴泛的应⽤于跨语⾔跨平台的数据交换。使⽤JSON的原因⾮常简单,因为它结构紧凑⽽且是纯⽂本,任何操作系统和编程语⾔都能处理纯⽂本,这就是实现跨语⾔跨平台数据交换的前提条件。⽬前JSON基本上已经取代了XML(可扩展标记语⾔)作为异构系统间交换数据的事实标准。可以在JSON的官⽅⽹站到更多关于JSON的知识,这个⽹站还提供了每种语⾔处理JSON数据格式可以使⽤的⼯具或三⽅库。
下⾯是JSON格式的⼀个简单例⼦,⼤家可能已经注意到了,它跟Python中的字典⾮常类似⽽且⽀持嵌套结构,就像Python字典中的值还可以是字典,如果我们把下⾯的代码输⼊到浏览器控制台中,它会创建出⼀个JavaScript中的对象。
{
"name": "骆昊",
"age": 40,
"friends": ["王⼤锤", "⽩元芳"],
"cars": [
{"brand": "BMW", "max_speed": 240},
{"brand": "Benz", "max_speed": 280},
{"brand": "Audi", "max_speed": 280}
]
}
JSON格式的数据类型和Python中的数据类型也是很容易到对应关系的,正如下⾯的两张表所⽰。
在Python中,我们可以使⽤json模块将字典或列表以JSON格式写⼊到⽂件中,代码如下所⽰。
import json
my_dict = {
'name': '骆昊',
'age': 40,
'friends': ['王⼤锤', '⽩元芳'],
'cars': [
{'brand': 'BMW', 'max_speed': 240},
{'brand': 'Audi', 'max_speed': 280},
{'brand': 'Benz', 'max_speed': 280}
]
}
with open('data.json', 'w') as file:
json.dump(my_dict, file)
print('字典已经保存到data.json⽂件中')
执⾏上⾯的代码,会创建data.json⽂件,⽂件的内容如下所⽰,中⽂是⽤Unicode编码书写的。
{"name": "u9a86u660a", "age": 40, "friends": ["u738bu5927u9524", "u767du5143u82b3"], "cars": [{"brand": "BMW", "max_speed": 240}, {"brand": "Audi", "max_sp
json模块有四个⽐较重要的函数,分别是:
dump - 将Python对象按照JSON格式序列化到⽂件中
dumps - 将Python对象处理成JSON格式的字符串
load - 将⽂件中的JSON数据反序列化成对象
loads - 将字符串的内容反序列化成Python对象
这⾥出现了两个概念,⼀个叫序列化,⼀个叫反序列化,上的解释是:“序列化(serialization)在计算机科学的数据处理中,是
指将数据结构或对象状态转换为可以存储或传输的形式,这样在需要的时候能够恢复到原先的状态,⽽且通过序列化的数据重新获取字节
时,可以利⽤这些字节来产⽣原始对象的副本(拷贝)。与这个过程相反的动作,即从⼀系列字节中提取数据结构的操作,就是反序列化(deserialization)”。
我们可以通过下⾯的代码,从上⾯创建的data.json⽂件中读取JSON格式的数据并还原成字典。
import json
with open('data.json', 'r') as file:
my_dict = json.load(file)
print(type(my_dict))
print(my_dict)
包管理⼯具pip的使⽤
Python标准库中的json模块在数据序列化和反序列化时性能并不是⾮常理想,为了解决这个问题,可以使⽤三⽅库ujson来替换json。所谓三⽅库,是指⾮公司内部开发和使⽤的,也不是来⾃于官⽅标准库的Python模块,这些模块通常由其他公司、组织或个⼈开发,所以被称为三⽅库。虽然Python语⾔的标准库虽然已经提供了诸多模块来⽅便我们的开发,但是对于⼀个强⼤的语⾔来说,它的⽣态圈⼀定也是⾮常繁荣的。
之前安装Python解释器时,默认情况下已经勾选了安装pip,⼤家可以在命令提⽰符或终端中通过pip --version来确定是否已经拥有了pip。pip是Python的包管理⼯具,通过pip可以查、安装、卸载、更新Python的三⽅库或⼯具,macOS和Linux系统应该使⽤pip3。例如要安装替代json模块的ujson,可以使⽤下⾯的命令。
pip install ujson
pip install ujson -i pypi.doubanio/simple
可以通过pip search命令根据名字查需要的三⽅库,可以通过pip list命令来查看已经安装过的三⽅库。如果想更新某个三⽅库,可以使
⽤pip install -U或pip install --upgrade;如果要删除某个三⽅库,可以使⽤pip uninstall命令。
搜索ujson三⽅库。
pip search ujson
micropython-cpython-ujson (0.2) - MicroPython module ujson ported to CPython
pycopy-cpython-ujson (0.2) - Pycopy module ujson ported to CPython
ujson (3.0.0) - Ultra fast JSON encoder and decoder for Python
ujson-bedframe (1.33.0) - Ultra fast JSON encoder and decoder for Pythonpython怎么读取json文件
ujson-segfault (2.1.57) - Ultra fast JSON encoder and decoder for Python. Continuing
development.
ujson-ia (2.1.1) - Ultra fast JSON encoder and decoder for Python (Internet
Archive fork)
ujson-x (1.37) - Ultra fast JSON encoder and decoder for Python
ujson-x-legacy (1.35.1) - Ultra fast JSON encoder and decoder for Python
drf_ujson (1.2) - Django Rest Framework UJSON Renderer
drf-ujson2 (1.6.1) - Django Rest Framework UJSON Renderer
ujsonDB (0.1.0) - A lightweight and simple database using ujson.
fast-json (0.3.2) - Combines best parts of json and ujson for fast serialization
decimal-monkeypatch (0.4.3) - Python 2 performance patches: decimal to cdecimal, json to
ujson for psycopg2
查看已经安装的三⽅库。
pip list
Package Version
----------------------------- ----------
aiohttp 3.5.4
alipay 0.7.4
altgraph 0.16.1
amqp 2.4.2
... ...
更新ujson三⽅库。
pip install -U ujson -i pypi.doubanio/simple
如果要更新pip本⾝,可以使⽤下⾯的命令。
macOS系统:
pip3 install -U pip
Windows系统:
python -m pip install -U pip
删除ujson三⽅库。
pip uninstall -y ujson
使⽤⽹络API获取数据
如果想在我们⾃⼰的程序中显⽰天⽓、路况、航班等信息,这些信息我们⾃⼰没有能⼒提供,所以必须使⽤⽹络数据服务。⽬前绝⼤多数的⽹络数据服务(或称之为⽹络API)都是基于HTTP提供JSON格式的数据,在Python程序中,我们可以发送HTTP请求给指定的URL(统⼀资源定位符),这个URL就是所谓的⽹络API,如果请求成功,它会返回HTTP响应,⽽HTTP响应的消息体中就有我们需要的JSON格式的数据。关于HTTP的相关知识,可以看看阮⼀峰的《HTTP协议⼊门》⼀⽂。
国内有很多提供⽹络API接⼝的⽹站,例如聚合数据、阿凡达数据等,这些⽹站上有免费的和付费的数据接⼝,国外的{API}Search⽹站也提供了类似的功能,有兴趣的可以⾃⾏研究。下⾯的例⼦演⽰了如何使⽤requests库(基于HTTP进⾏⽹络资源访问的三⽅库)访问⽹络API 获取国内新闻并显⽰新闻标题和链接,这个例⼦使⽤了天⾏数据提供的国内新闻数据接⼝,其中的APIKey需要⾃⼰到⽹站上注册申请。
安装requests库。
pip install requests -i pypi.doubanio/simple/
获取国内新闻并显⽰新闻标题和链接。
import requests
resp = ('api.tianapi/guonei/?key=APIKey&num=10')
if resp.status_code == 200:
data_model = resp.json()
for news in data_model['newslist']:
print(news['title'])
print(news['url'])
print('-' * 60)
注意:上⾯代码中的APIKey需要换成⾃⼰在天⾏数据⽹站申请的APIKey,同时还要申请开通国内新闻的接⼝才能获取到JSON格式 注意
的数据。这个⽹站上还有很多⾮常有意思的⽹络API接⼝,例如:垃圾分类、美⼥图⽚、周公解梦等等,⼤家可以仿照上⾯的代码来调⽤这些接⼝。
简单的总结
Python中实现序列化和反序列化除了使⽤json模块之外,还可以使⽤pickle和shelve模块,但是这两个模块是使⽤特有的序列化协议来序列化数据,因此序列化后的数据只能被Python识别,关于这两个模块的相关知识可以⾃⼰看看⽹络上的资料。处理JSON格式的数据很显然是程序员必须掌握的⼀项技能,因为不管是访问⽹络API接⼝还是提供⽹络API接⼝给他⼈使⽤,都需要具备处理JSON格式数据的相关知识。
⼀定记得点赞收藏哟!
温馨提⽰
温馨提⽰:⼤家如果觉得这个专栏还不错, ⼀定记得点赞收藏哟
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论