流畅的python学习笔记-第4章

第4章 文本和字节序列

[toc]

编码和解码

markdom可以插入emoji表情包
其中作为前缀,x1f54为对应表情的unicode编码
🥺
emoji

把码位转换成字节序列的过程是编码;把字节序列转换成码位的过程是解码

decode的作用是将其他编码的字符串转换成unicode编码
如str1.decode('gb2312'),表示将gb2312编码的字符串转换成unicode编码。

encode的作用是将unicode编码转换成其他编码的字符串
如str2.encode('gb2312'),表示将unicode编码的字符串转换成gb2312编码。

Python 3默认使用UTF-8编码源码,Python 2(从2.5开始)则默认使用ASCII。
如果加载的.py模块中包含UTF-8之外的数据,而且没有声明编码,会报错

title: python 2 编解码过程
编码前其他编码字符串->unicode: 编码 decode
unicode->>编码后其他编码字符串:解码 encode
在新版本的python3中,取消了unicode类型,代替它的是使用unicode字符的字符串类型(str),字符串类型(str)成为基础类型

如下所示,而编码后的变为了字节类型(bytes)

title: python 3 编解码过程

编码前其他编码字符串->str(unicode): 编码 decode
str(unicode)->>编码后其他编码字符串:解码 encode
# 指定字符串类型对象u
u = "中文"
print(u, type(u))

# 以gb2312编码对u进行编码,获得bytes类型对象str
str = u.encode('gb2312')
print(str, type(str))

# 以gb2312编码对字符串str进行解码,获得字符串类型对象u1
u1 = str.decode('gb2312')
print(u1, type(u1))

返回结果:

中文 <class 'str'>
b'\xd6\xd0\xce\xc4' <class 'bytes'>
中文 <class 'str'>


chardet模块

chardet模块检测读取出来的str是什么编码格式的
from urllib.request import urlopen
import chardet

rawdata = urlopen('http://baidu.com/').read()
chr = chardet.detect(rawdata)
print(chr) # {'encoding': 'ascii', 'confidence': 1.0, 'language': ''}



json.dumps在默认情况下,对于非ascii字符生成的是相对应的字符编码,而非原始字符.

首先明确,chardet这个是判断编码而不是判断数据类型的,
其次,加encode只是将其变成了字节,
chardet只能够接受字节而不能接收字符类型的
import json
import chardet

dict1 = {"haha": "哈哈"}

# json.dumps 默认ascii编码
print(json.dumps(dict1))  # {"haha": "\u54c8\u54c8"}

# 禁止ascii编码后默认utf-8
print(json.dumps(dict1, ensure_ascii=False))  # {"haha": "哈哈"}

# ascii
ss = chardet.detect(json.dumps(dict1).encode())
print(ss)

# utf-8
ss = chardet.detect(json.dumps(dict1, ensure_ascii=False).encode())
print(ss)


json与字典区别

在python中,字典的输出内容跟json格式内容一样,但是字典的格式是字典,json的格式是字符串,所以在传输的时候(特别是网页)要转换使用。

重要函数

编码:把一个Python对象编码转换成Json字符串 json.dumps()
解码:把Json格式字符串解码转换成Python对象 json.loads()

举个例子:

import json
dic = {'str': 'this is a string', 'list': [1, 2, 'a', 'b']}
print(type(dic))  # <class 'dict'>
print(dic)

json_obj = json.dumps(dic)
print(type(json_obj))  # <class 'str'>
print(json_obj)

dic1 = json.loads(json_obj)
print(type(dic1))  # <class 'dict'>
print(dic1)


几个主要函数

dump,dumps,load,loads
带s跟不带s的区别是 带s的是对 字符串的处理,而不带 s的是对文件对像的处理。
import json
from io import StringIO

# 创建文件流对象
io = StringIO()

# 把 json编码数据导向到此文件对象
json.dump(['streaming API'], io)

# 取得文件流对象的内容
print(io.getvalue())  # ["streaming API"]


参数ensure_ascii

默认为True,所有的非ascii字符在输出时都会被转义为uxxxx的序列,
返回的对象是一个只由ascii字符组成的str类型,为False时不会进行转义输出,反回的对象是个unicode。(这个参数对包含中文的json输出时非常有用



举个例子:

import json

data = {u'我': u'是', u'美': u'女'}

print(json.dumps(data))  # {"\u6211": "\u662f", "\u7f8e": "\u5973"}

print(json.dumps(data, ensure_ascii=False))  # {"我": "是", "美": "女"}



处理中文json时,要想不每次都给一堆重复的参数,可以用partial

import json
from functools import partial

json_dumps = partial(json.dumps, ensure_ascii=False, sort_keys=True)

data = {u'我': u'是', u'美': u'女'}

print(json_dumps(data))  # {"我": "是", "美": "女"}


看一个例子:

import json

# 使用双引号、单引号都可以的,建议使用双引号
h = '{"foo":"bar", "foo2":"bar2"}'
d = "{'muffin' : 'lolz', 'foo' : 'kitty'}"

json_obj1 = json.dumps(h)
json_obj2 = json.dumps(d)

dic1 = json.loads(json_obj1)
dic2 = json.loads(json_obj2)

print("json_obj1=", json_obj1)
print("json_obj2=", json_obj2)
print("dic1=", dic1)
print("dic1 type=", type(dic1))
print("dic2=", dic2)
print("dic2 type=", type(dic2))


总结:

Python 的字典是一种数据结构,JSON 是一种数据格式。
Python的字典key可以是任意可hash对象,json只能是字符串


json模块和simplejson模块


环境:
python 3.6+
json: 2.0.9
simplejson: 3.16.0


  • 区别1
import json
import simplejson

json_str = b'hello'
json_str = json_str.decode() # 使用json模块必须要先加入这一行否则会报错
print(json.dumps(json_str))
print(simplejson.dumps(json_str))

比较性能方面的差异:

压测数据包链接

压测脚本:

import timeit
import simplejson
import pickle
import json

times = 100
print("Times are for %i iterations" % times)

f = open('words.pickle', "rb")
words = pickle.load(f)
f.close()


def bench(cmd, imprt):
    t = timeit.Timer(cmd, imprt)
    s = t.timeit(number=times)
    print("%s total=%02f avg=%02f" % (cmd, s, (s / times)))
    return s


def simplejson_loads():
    simplejson.loads(simplejson.dumps(words))


def simplejson_dumps():
    simplejson.dumps(words)


b1 = bench('simplejson_loads()', 'from __main__ import simplejson_loads')
b2 = bench('simplejson_dumps()', 'from __main__ import simplejson_dumps')


def json_dumps():
    json.dumps(words)


def json_loads():
    json.loads(json.dumps(words))


b3 = bench('json_loads()', 'from __main__ import json_loads')
b4 = bench('json_dumps()', 'from __main__ import json_dumps')

返回结果是:

Times are for 100 iterations
simplejson_loads() total=1.760785 avg=0.017608
simplejson_dumps() total=0.921571 avg=0.009216
json_loads() total=1.351725 avg=0.013517
json_dumps() total=0.716219 avg=0.007162
从上面结果可以看到json 在loads操作和dumps操作都比simplejson好
网上说的simplejson比json快,感觉说的不对
Image placeholder
Demi_Mo
未设置
  81人点赞

没有讨论,发表一下自己的看法吧

推荐文章
流畅的python学习笔记-第5章

第5章函数[toc]函数在python中一切都可以视作为对象,包括函数deffunction_try(): '''itisfuncitontrydoc''' print('function_tryd

流畅的Python读书笔记 --- 第一章 Python数据模型

近期开始读“流畅的Python”这本书,想把自己的读书笔记分享给大家,希望能帮到也对这本书感兴趣但是没时间看的各位。(文章中大部分的话和图片摘录总结自“流畅的Python”一书,以及python官方网

一文带你掌握常见的Pandas性能优化方法,让你的pandas飞起来!

微信公众号:「Python读财」如有问题或建议,请公众号留言Pandas是Python中用于数据处理与分析的屠龙刀,想必大家也都不陌生,但Pandas在使用上有一些技巧和需要注意的地方,尤其是对于较大

超8千Star,火遍Github的Python反直觉案例集!

大数据文摘授权转载作者:SatwikKansal译者:暮晨Python,是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性。但有的时候,Python的一些输出结果对于初学者来说似

最适合入门的Python数据分析实战项目

微信公众号:「Python读财」如有问题或建议,请公众号留言伴随着移动互联网的飞速发展,越来越多用户被互联网连接在一起,用户所积累下来的数据越来越多,市场对数据方面人才的需求也越来越大,由此也带火了如

2019机器学习框架之争:与Tensorflow竞争白热化,进击的PyTorch赢在哪里?

大数据文摘出品来源:thegradient编译:张大笔茹、曹培信、刘俊寰、牛婉扬、Andy2019年,机器学习框架之争进入了新阶段:PyTorch与TensorFlow成为最后两大玩家,PyTorch

Python 教程-了解Python

什么是Python Python能干什么? 有什么特点? 什么是Python 官方介绍: Python是一个易于学习、功能强大的编程语言。它拥有高效高级的数据结构和一种简单有效的面向对象编程的

Python 教程-Python 安装

在Windows上安装 访问https://www.python.org/downloads/并下载最新版本。在撰写时当前最新是3.8。在安装的时候和其他软件一样,无脑式下一步。需要注意的是如果在W

Python入门教程_2. 使用 Python 解释器

2.1.调用解释器 Python解释器通常安装在目标机器上的/usr/local/bin/python3.7目录下;把/usr/local/bin目录放进你的Unixshell的搜索路径里,确保它可以

Python入门教程_3. Python 简介

在下面的例子中,输入和输出分别由大于号和句号提示符(>>>和...)标注:如果想重现这些例子,就要在解释器的提示符后,输入(提示符后面的)那些不包含提示符的代码行。需要注意的是在练习中遇到的从属提示符

Python入门教程_4. 深入 Python 流程控制

除了刚刚介绍的while语句,Python还有一些在其他语言中常见的控制流语句,并做了一些改动。 4.1.if语句 也许最著名的语句是if语句了。 例如: >>>x=int(input("Please

【python测试开发栈】帮你总结python random模块高频使用方法

随机数据在平时写python脚本时会经常被用到,比如随机生成0和1来控制逻辑、或者从列表中随机选择一个元素(其实抽奖程序也类似,就是从公司所有人中随机选择中奖用户)等等。这篇文章,就帮大家整理在pyt

【python测试开发栈】帮你总结python time模块高频使用方法

在平时写python脚本时,时间是我们经常用到的数据,比如:时间戳、前端展示的对应格式的时间等,在python中主要有三个和时间处理相关的模块:time、datetime、calendar,这篇文章主

UfqiNews有福新闻的第N+1批次更新:清晰,流畅,省电

UfqiNews有福新闻自推出以来,一直持续更新、优化升级,作为一款带来全新新闻阅读体验的资讯应用,已经日益成熟,浏览量也日渐攀升。近日针对UfqiNews有福新闻的升级改进包括如下方面。1.UI调整

jQuery 学习笔记

jQuery中的dom追加操作方法(主动/被动、前面/后面、里面/外面): append:主动/后面/里面 appendTo:被动/后面/里面 prepend:主动/前面/里面 prependTo:被

软件工程学习笔记(一):软件工程

1计算机软件1.1软件计算机软件是指计算机系统中的程序以及文档,程序是计算任务处理对象和处理规则的描述.1.2软件特点 一种逻辑实体. 维护工作量大. 维护软件过程中会引入副作用. 1.3软件分类1.

go学习笔记-goroutine竞争状态

如果两个或者多个goroutine在没有相互同步状态的情况下同时访问某个资源,并且同时对这个资源进行读写的时候,对于这个资源就处于相互竞争状态(racecandition)。下面来看一个相互竞争的例子

Redis学习笔记2—缓存、集群、一致性等

缓存淘汰策略为了保证高性能,缓存都保存在内存中,当内存满了之后,需要通过适当的策略淘汰老数据,以便腾出空间存储新数据。数据的淘汰策略,典型的包括FIFO(先进先出,淘汰最老数据),LRU(淘汰最近最少

使用phpStudy小皮面板,typecho的POST数据提交无反应问题

在安装typecho的过程中,遇到提交数据无反应,页面不报错的问题,十分迷惑。刚开始以为是centos系统文件夹权限问题,反复修改权限都无法解决问题。最后发现是,小皮面板默认开启的防火墙问题,直接关闭

Python中的系统内置模块笔记

系统内置模块就是按照python解释器后,系统给提供的模块 在需要时可以导入后使用,例如:json,re,os。。。 序列化模块 序列化是指可以把python中的数据,以文本或二进制的方式进行转

Python time时间模块笔记

time时间模块 importtime ''' 概念: 1。时间戳:1574905882.6581771表示从1970年1月1日0时0分0秒到现在的一个秒数,目前可以计算到2

Python 初识面向对象笔记

面向对象编程——ObjectOrientedProgramming,简称OOP,是一种以对象为中心的程序设计思想。 面向过程编程——ProcedureOrientedProgramming,简称PO

Python 面向对象 OOP-三大特性笔记

面向对象的三大特性:封装,继承,多态 封装 封装就是使用特殊的语法,对成员属性和成员方法进行包装,达到保护和隐藏的目的但是一定注意,不能把成员全部封装死,就失去意义了被封装的成员主要是供类的内部

Python 面向对象 OOP-三大特性笔记

面向对象的三大特性:封装,继承,多态 封装 封装就是使用特殊的语法,对成员属性和成员方法进行包装,达到保护和隐藏的目的但是一定注意,不能把成员全部封装死,就失去意义了被封装的成员主要是供类的内部

Python 面向对象 高阶-描述符与设计模式笔记

描述符 当一个类中,包含了三个魔术方法(__get__,__set__,__delete__)之一,或者全部时,那么这个类就称为描述符类 作用 描述符的作用就是对一个类中的某个成员进行一个详细的