PYTHON开发必备技能(4)

第7名:Json&Pickle(序列化与反序列化模块)

参考Java网址:http://blog.csdn.net/a2011480169/article/details/51771539

绪言:Python中eval内置函数的作用:

eval()是Python内置的工具函数,其功能是将字符串对象转化为有效的表达式参与求值运算,并返回计算结果。

通过eval()可以在字符串对象和字典、列表、元组对象之间进行相互转换。

代码示例:

str_info1 = "(‘python‘,‘Java‘,‘Scala‘)"
print(str_info1,type(str_info1))
print(eval(str_info1),type(eval(str_info1)))

str_info2 = "[‘python‘,‘Java‘,‘Scala‘]"
print(str_info2,type(str_info2))
print(eval(str_info2),type(eval(str_info2)))

str_info3 = ‘{"name":"python","price":2000}‘
print(str_info3,type(str_info3))
print(eval(str_info3),type(eval(str_info3)))

运行结果: 

(‘python‘,‘Java‘,‘Scala‘) <class ‘str‘>
(‘python‘, ‘Java‘, ‘Scala‘) <class ‘tuple‘>
[‘python‘,‘Java‘,‘Scala‘] <class ‘str‘>
[‘python‘, ‘Java‘, ‘Scala‘] <class ‘list‘>
{"name":"python","price":2000} <class ‘str‘>
{‘name‘: ‘python‘, ‘price‘: 2000} <class ‘dict‘>

Process finished with exit code 0

eval()内置函数的缺陷:

eval()就是用来提取字符串中的数据类型的,但是eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了,所以eval的重点还是通常用来执行一个字符串表达式,并返回表达式的值。

代码示例:

 import json
 x="[null,true,false,1]"
 print(eval(x)) #报错,无法解析null类型,而json就可以
print(json.loads(x))

上面这个例子这样改就可以了:

import json
x = "[None,True,False,1]"
print(eval(x))

用于序列化的两个模块:

json,用于字符串 和 python数据类型间进行转换

pickle,用于python特有的类型 和 python的数据类型间进行转换

Json模块提供了四个功能:dumps、dump、loads、load

pickle模块提供了四个功能:dumps、dump、loads、load

Json提供了一种通用的序列化与反序列化方式:

序列化和反序列化的概念:(重要)

将内存中的数据类型转化成字符串或者bytes类型(二进制形式),叫做序列化(json、pickle、serialization);序列化之后,就可以把序列

化后的内容写入磁盘,或者通过网络传输到别的机器上。将字符串或者bytes类型(二进制形式)转化成内存中的数据类型,叫做反序列化。

在Python当中,自己的序列化方式与反序列化方式为pickle,代码如下所示:

代码示例1:

import pickle

user_info = {
    ‘name‘:‘angele‘,
    ‘age‘:35,
    ‘city‘:‘beijing‘,
}

print(user_info,type(user_info))

#python特有的序列化方式:pickle,将Python中的数据类型转化为bytes
p_bytes = pickle.dumps(user_info)
print(p_bytes,type(p_bytes))

#python特有的反序列化方式:pickle,将bytes转化为Python中的数据类型
user_info = pickle.loads(p_bytes)
print(user_info)

运行结果:

{‘name‘: ‘angele‘, ‘age‘: 35, ‘city‘: ‘beijing‘} <class ‘dict‘>
b‘\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x06\x00\x00\x00angeleq\x02X\x03\x00\x00\x00ageq\x03K#X\x04\x00\x00\x00cityq\x04X\x07\x00\x00\x00beijingq\x05u.‘ <class ‘bytes‘>
{‘name‘: ‘angele‘, ‘age‘: 35, ‘city‘: ‘beijing‘}

代码示例2:将Python中序列化后的数据写入到磁盘当中,并反序列化读取(推荐的方式)

dumps与loads的组合使用

import pickle

user_info = {
    ‘name‘:‘angele‘,
    ‘age‘:35,
    ‘city‘:‘beijing‘,
}

with open(‘example.pkl‘,‘wb‘) as fw:
    print(pickle.dumps(user_info))
    fw.write(pickle.dumps(user_info))

with open(‘example.pkl‘,‘rb‘) as fr:
    user_info = pickle.loads(fr.read())
    print(user_info,type(user_info))

运行结果:

b‘\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x06\x00\x00\x00angeleq\x02X\x03\x00\x00\x00ageq\x03K#X\x04\x00\x00\x00cityq\x04X\x07\x00\x00\x00beijingq\x05u.‘
{‘name‘: ‘angele‘, ‘age‘: 35, ‘city‘: ‘beijing‘} <class ‘dict‘>

Process finished with exit code 0

代码示例3:将Python中序列化后的数据写入到磁盘当中,并反序列化读取(利用文件句柄,不推荐的方式) 

dump与load的组合使用

import pickle

user_info = {
    ‘name‘:‘angele‘,
    ‘age‘:35,
    ‘city‘:‘beijing‘,
}

with open(‘example.pkl‘,‘wb‘) as fw:
    pickle.dump(user_info,fw)

with open(‘example.pkl‘,‘rb‘) as fr:
    print(pickle.load(fr))

"""
{‘name‘: ‘angele‘, ‘age‘: 35, ‘city‘: ‘beijing‘}

Process finished with exit code 0
"""

上面讲的方式都是Python特有的序列化与反序列的方式,接下来讲一种通用的序列化与反序列的方式。

Json的序列化与反序列化方式:

代码示例1:

import json

user_info = {
    ‘name‘:‘angele‘,
    ‘age‘:35,
    ‘city‘:‘beijing‘,
}

#Json序列化:将Python的数据类型转化为字符串
str_js = json.dumps(user_info)
print(str_js,type(str_js))

#Json反序列化:将字符串转化为python中的数据类型
user_info = json.loads(str_js)
print(user_info,type(user_info))

运行结果:

{"city": "beijing", "age": 35, "name": "angele"} <class ‘str‘>
{‘city‘: ‘beijing‘, ‘age‘: 35, ‘name‘: ‘angele‘} <class ‘dict‘>

Process finished with exit code 0

代码示例2:将Python中序列化后的数据写入到磁盘当中,并反序列化读取(推荐这种通用的方式)

dumps和loads

import json

user_info = {
    ‘name‘:‘angele‘,
    ‘age‘:35,
    ‘city‘:‘beijing‘,
}

#序列化
with open(‘example.json‘,encoding=‘utf-8‘,mode=‘w‘) as fw:
    user_info = json.dumps(user_info)
    print(user_info,type(user_info))
    fw.write(user_info)

#反序列化
with open(‘example.json‘,encoding=‘utf-8‘,mode=‘r‘) as fr:
    user_info = json.loads(fr.read())
    print(user_info,type(user_info))

运行结果:

{"name": "angele", "age": 35, "city": "beijing"} <class ‘str‘>
{‘name‘: ‘angele‘, ‘age‘: 35, ‘city‘: ‘beijing‘} <class ‘dict‘>

Process finished with exit code 0

example文件中的数据:

代码示例3:将Python中序列化后的数据写入到磁盘当中,并反序列化读取(利用文件句柄,不推荐这种通用的方式)

dump和load的组合

import json

user_info = {
    ‘name‘:‘angele‘,
    ‘age‘:35,
    ‘city‘:‘beijing‘,
}

#序列化
with open(‘example.json‘,encoding=‘utf-8‘,mode=‘w‘) as fw:
    json.dump(user_info,fw)

#反序列化
with open(‘example.json‘,encoding=‘utf-8‘,mode=‘r‘) as fr:
    print(json.load(fr))

JSON的概念:

JSON是一种轻量级的数据交换格式,本质就是一串字符串.

如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示

出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。

JSON不仅是标准格式,而且比XML更快,而且可以直接在Web页面中读取,非常方便。Json最广泛的应用是作为AJAX中web服务器和客户

端的通讯的数据格式。

 

Json与pickle的异同点:

第一:Json在写入和读取数据时,是以字符串类型进行操作;pickle在写入和读取数据时,则是以二进制的格式进行操作。

第二:Json只支持一些简单的通用的数据类型,如字符串、列表、字典、元祖、集合等;pickle支持简单的数据类型,也支持复杂的数据

类型,如函数、类等。即pickle可以支持序列化python中所有的数据类型。

第三:Json可以跨语言进行转换,pickle只能在Python中使用。

第四:Json是一种通用的序列化与反序列化的方式,而pickle是Python自己独有的序列化与反序列化的方式。

 

注意:如果向文件当中写数据,只能写两种格式:

第一:文本字符串(数字都必须要先变成字符串)

第二:bytes b‘\x80\x03}q\x00(X\x02\x00\x00\x00i‘类型。

疑问:

 实战:

Json本质就是Json串,下面如何理解?

str_info = "python"
print(json.loads(str_info))

ValueError: Expecting value: line 1 column 1 (char 0)

 第8名:hashlib加密模块

这个算法我在工作当中在Django的时候用到过,在校验文件的时候也用到过。

Python中hashlib算法的作用

print(time.clock())

Python的hashlib算法提供了常见的摘要算法,如md5、sha1等等,摘要算法又称哈希算法、散列算法。

摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被别人篡改过。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困

难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

Python中hashlib模块使用的方法:

第一:创建一个哈希对象h = hashlib.md5()

第二:将字节对象arg填充到哈希对象中,arg通常为要加密的字符串

h.update(arg)

第三:调用digest() 或 hexdigest()方法来获取摘要(加密结果)

h.hexdigest()

hashlib校验文件的原理:

如果同一个hash对象重复调用update()方法,则m.update(a); m.update(b) 等效于 m.update(a+b)



示例程序1:

import hashlib

"""
python中hashlib算法的基本使用方法:
"""

#第一:创建一个哈希对象、h=hashlib.md5()
h = hashlib.md5()

#第二:将字节对象arg填充到哈希对象当中,arg通常为要加密的字符串
h.update(‘angela‘.encode(‘utf-8‘))

#第三:调用hexdigest()方法来获取摘要(加密结果)
print(h.hexdigest())

运行结果:

36388794be2cf5f298978498ff3c64a2

Process finished with exit code 0

  

示例程序2:(Django中用户名和密码的校验)

import hashlib

"""
python中的hashlib算法在Django中的类似应用
"""

user_name = input(‘请输入注册的用户名:‘)
pass_word = input(‘请输入注册的密码:‘)

print(‘\033[42m您注册的用户名是:%s,密码是:%s\033[0m‘%(user_name,pass_word))
m1 = hashlib.md5()
m1.update(pass_word.encode(‘utf-8‘))
pass_word_md5 = m1.hexdigest()
print(pass_word_md5)

#将用户注册后的信息写到数据库当中
with open(‘db.txt‘,encoding=‘utf-8‘,mode=‘w‘) as fw:
    fw.write(‘%s|%s‘%(user_name,pass_word_md5))

#用户二次登陆进行用户名和密码校验
username = input(‘请输入注册的用户名:‘)
password = input(‘请输入注册的密码:‘)

m2 = hashlib.md5()
m2.update(password.encode(‘utf-8‘))
password_md5 = m2.hexdigest()

with open(‘db.txt‘,encoding=‘utf-8‘,mode=‘r‘) as fr:
    user,pwd = fr.read().split(‘|‘)
    print(user,pwd)
    if user == username and pwd == password_md5:
        print(‘登陆成功..‘)
    else:
        print(‘登陆失败..‘)

  

示例程序3:(****)

import hashlib

"""
python中的hashlib算法在文本校验中的用法:实际上就是校验文本字符串的内容
"""

m1 = hashlib.md5()
m1.update(‘angela‘.encode(‘utf-8‘))
m1.update(‘helloyou‘.encode(‘utf-8‘))
print(m1.hexdigest())

m2 = hashlib.md5()
m2.update(‘angelahelloyou‘.encode(‘utf-8‘))
print(m2.hexdigest())

运行结果:

eb4ab8ec5815365e9fc88dfa444d9796
eb4ab8ec5815365e9fc88dfa444d9796

Process finished with exit code 0

  

示例程序4:(文本文件的校验)

import hashlib

"""
python中的hashlib算法在文本校验中的用法:实际上就是校验文本字符串的内容
"""

m = hashlib.md5()
with open(‘db.txt‘,encoding=‘utf-8‘,mode=‘r‘) as fr:
    data = fr.read()
    m.update(data.encode(‘utf-8‘))
    print(m.hexdigest())

print(‘****************‘)
#下面的方式每次在内存当中只存在一个数值:这种方式是我们推荐的
m2 = hashlib.md5()
with open(‘db.txt‘,encoding=‘utf-8‘,mode=‘r‘) as fr:
    for line in fr:
        m2.update(line.encode(‘utf-8‘))
    print(m2.hexdigest())

运行结果:

3232ea30e0a71e5f5c3e83676f64c9eb
****************
3232ea30e0a71e5f5c3e83676f64c9eb

Process finished with exit code 0  

示例程序5:获取标志Id

import hashlib
import time

def get_id():
    h = hashlib.md5()
    h.update(str(time.clock()).encode(‘utf-8‘))
    return h.hexdigest()

print(get_id())
print(get_id())
print(get_id())
print(get_id())

运行结果:

85b8a467159e14ec4b2d16bff39ed199
5b0526b768b41eb7b4d1a8e741b1dae5
42999cb93fd523a787960fec38530026
ce1322698e3badb958538b1100c8d550
7b7bc63304b72fa74f81d01e8317c66d

Process finished with exit code 0

  

原文地址:https://www.cnblogs.com/zmyting/p/9508862.html

时间: 2024-08-05 05:21:40

PYTHON开发必备技能(4)的相关文章

PYTHON开发必备技能(5)

Python反射机制 我记得以前学习Java的时候,就接触到了反射的概念,后来随着工作,经常听到反射的概念,今天决定好好总结一下. 下面3篇博客我感觉写的很不错,大家可以进行参考. https://blog.csdn.net/qq_37267015/article/details/71406953 http://www.mamicode.com/info-detail-1401422.html https://www.cnblogs.com/huxi/archive/2011/01/02/192

天下武功,无快不破,Python开发必备的6个库

01 Python 必备之 PyPy PyPy 主要用于何处? 如果你需要更快的 Python 应用程序,最简单的实现的方法就是通过 PyPy ,Python 运行时与实时(JIT)编译器.与使用普通的 Python 对等程序相比,使用 PyPy 的 Python 应用程序的运行速度平均提升7.5倍.不幸的是,PyPy 与许多 Python 的明星框架并不是很好地兼容.PyPy 5.9 在解决这个问题上取得了重大进展. PyPy 5.9 的功能 数据科学框架 NumPy 和 Pandas 现在运

微信应用号开发必备技能都在这里了啦!

"微信应用号"就像平地里炸响的一声春雷,在互联网圈内炸开了锅,小代码小程序即将成为主流,H5迎来了自己的第二春.废话少说,关于微信应用号开发技能,你都掌握了吗? 没掌握的看这里,干货全在这儿了! 下载中心: <HTML 5 从入门到精通>-中文学习教程 http://down.51cto.com/data/2121865 HTML5与CSS3基础教程(第8版)中文高清版 http://down.51cto.com/data/2213571 HTML5权威指南 http://

python 开发必备知识

Python基础语法入门(2天): 1.Python语言介绍.发展史.与其它语言的对比 2.编程语言分类.解释型vs编译型优缺点 3.Python环境安装.Pycharm IDE使用 4.基本语法:变量.常量命名规范.程序执行.编码区别 5.二进制的演化与运算 6..pyc是什么鬼? 7.实战案例:用户交互小程序 8.基本数据类型:int.str.bool.list.dict.set 9.流程控制:if.elif.else.for.while语句 10.break vs continue的作用

Android开发必备技能——修改debug签名

前言 从事Android开发的小伙伴们,想必都会遇到这样的问题.当你的应用中需要集成百度地图.极光推送等第三方平台时,会去申请一个叫做AppKey的东西.与此同时,你得提供下应用签名信息的MD5或SHA1.然后就悲催的发现,只有用指定的签名文件打包时,该功能才能正常使用.如果你用的是开发工具的debug keystore签名信息,直接run一下就好,如果你用的是APP发布时候的keystore,每次测试时都得export 一个apk.心中一万只草泥马在奔腾的有木有? 楼主之前的小伎俩就是,去申请

Eclipse开发必备技能

1.Eclipse换上优雅的外衣 http://www.hpboys.com/901.html 2.eclipse集成svn,emmet插件 http://www.hpboys.com/664.html 3.Eclipse快捷键指南 http://www.hpboys.com/904.html 4.使用Eclipse设置Java注释模板详解 http://www.hpboys.com/720.html 5. [精]国外程序员整理的Java资源大全 http://www.hpboys.com/70

解读前端开发工程师必备技能

看到这个标题的大都是前端开发边缘的同学,有多少能直言不讳的说自己是前端工程师呢?不是打击谁谁谁,而是我们需要反思一个问题:什么才是真正意义上的前端开发呢? 前端开发这个职业始于几年前,至今已发展的初步成熟了.如果你打算进入这个行业,你要做好的准备,因为要学的要懂得的实在不少:如果你已经在这个行业一两年了,也请你不要放弃对前端开发的继续追寻和研究:更老一点的,浩子也就不能说什么了,是你们让更好的前端发展至今,在此抱以感激! 上述一段,也就是把前端的开发者总概了一下,下面我们来看看前端需要什么技能?

web前端开发工程师必备技能

看到这个标题的大都是前端开发边缘的同学,有多少能直言不讳的说自己是前端工程师呢?不是打击谁谁谁,而是我们需要反思一个问题:什么才是真正意义上的前端开发呢? 前端开发这个职业始于几年前,至今已发展的初步成熟了.如果你打算进入这个行业,你要做好的准备,因为要学的要懂得的实在不少:如果你已经在这个行 业一两年了,也请你不要放弃对前端开发的继续追寻和研究:更老一点的,也就不能说什么了,是你们让更好的前端发展至今,在此抱以感激! 上述一段,也就是把前端的开发者总概了一下,下面我们来看看前端需要什么技能?

CSDN日报20170511 ——《开发人员的必备技能》

[程序人生]开发人员的必备技能 作者:葡萄城控件技术团队 对于刚开始学习软件开发的新人来说,"必备技能"往往意味着一个长长的.标有重要度的学习列表,但是过长的列表通常会导致新人不知如何开始学习,压力倍增. 本文尝试列举出最重要的几个技能,也期望通过此列表能给新人一个比较明确的学习重点和路径. 点击阅读全文 [物联网]JavaScript -- 下一代物联网全栈开发 作者:CSDN物联网开发 当下这个物联网大热的时代,JavaScript 支持 HTTP 和 JSON.支持函数式编程.可