1、以某种存储形式使自定义对象持久化;
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。

Json模块提供了四个功能:dumps、dump、loads、load
import json dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = json.dumps(dic) #序列化:将一个字典转换成一个字符串 print(type(str_dic),str_dic) #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"} #注意,json转换完的字符串类型的字典中的字符串是由""表示的 dic2 = json.loads(str_dic) #反序列化:将一个字符串格式的字典转换成一个字典 #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示 print(type(dic2),dic2) #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}] str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}] list_dic2 = json.loads(str_dic) print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
import json f = open('json_file','w') dic = {'k1':'v1','k2':'v2','k3':'v3'} json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件 f.close() f = open('json_file') dic2 = json.load(f) #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回 f.close() print(type(dic2),dic2)
其他参数说明
Serialize obj to a JSON formatted str.(字符串表示的json对象) Skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key ensure_ascii:,当它为True的时候,所有非ASCII码字符显示为㌱序列,只需在dump时将ensure_ascii设置为False即可,此时存入json的中文即可正常显示。) If check_circular is false, then the circular reference check for container types will be skipped and a circular reference will result in an OverflowError (or worse). If allow_nan is false, then it will be a ValueError to serialize out of range float values (nan, inf, -inf) in strict compliance of the JSON specification, instead of using the JavaScript equivalents (NaN, Infinity, -Infinity). indent:应该是一个非负的整型,如果是0就是顶格分行显示,如果为空就是一行最紧凑显示,否则会换行且按照indent的数值显示前面的空白分行显示,这样打印出来的json数据也叫pretty-printed json separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’);这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。 default(obj) is a function that should return a serializable version of obj or raise TypeError. The default simply raises TypeError. sort_keys:将数据根据keys的值进行排序。 To use a custom JSONEncoder subclass (e.g. one that overrides the .default() method to serialize additional types), specify it with the cls kwarg; otherwise JSONEncoder is used.
json格式化输出
import json data = {'username':['李华','二愣子'],'sex':'male','age':16} json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False) print(json_dic2)
import pickle dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = pickle.dumps(dic) print(str_dic) #一串二进制内容 dic2 = pickle.loads(str_dic) print(dic2) #字典 import time struct_time = time.localtime(1000000000) print(struct_time) f = open('pickle_file','wb') pickle.dump(struct_time,f) f.close() f = open('pickle_file','rb') struct_time2 = pickle.load(f) print(struct_time2.tm_year)
json模块里的dumps是将python的数据结构转换成字符串,loads是将字符串类型转换成python的数据结构
json模块里的dump是将python的数据结构转换成字符串,然后存入到文件当中
json模块里的load是将文件中字符串类型转换成python的数据结构
pickle模块里的dumps是将python的数据结构转换成二进制的文件,loads是将二进制的文件转换成python的
数据结构
pickle模块里的dump是将python的数据结构转换成二进制然后存入到文件中
pickle模块里的load是将文件中的二进制文件转成python的数据结构
random是一个随机模块
获取0-1之间的随机小数
import random
print(random.random())
生成指定的数字内的随机小数
import random print(random.uniform(1,5))
整数随机
import random print(random.randint(1,5))
随机生成奇偶数
import random print(random.randrange(1,5,2)) #随机生成1-5的奇数 print(random.randrange(0,5,2)) #随机生成0-5的偶数
有一个列表,从中随机抽取一个
import random lst = ['张开','宝元','佩奇','太白'] print(random.choice(lst)) 随机抽取两个几多个 import random lst = ['张开','宝元','佩奇','太白'] print(random.choices(lst,k=2))
让一个列表变成随机排序
import random lst = [1,2,3,4,5,6] random.shuffle(lst) print(lst)
os模块是与操作系统交互的一个接口
#和文件夹相关 os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 #和文件相关 os.remove() 删除一个文件 os.rename("oldname","newname") 重命名文件/目录 os.stat('path/filename') 获取文件/目录信息 #和操作系统差异相关 os.sep 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/" os.linesep 输出当前平台使用的行终止符,win下为" ",Linux下为" " os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' #和执行系统命令相关 os.system("bash command") 运行shell命令,直接显示 os.popen("bash command).read() 运行shell命令,获取执行结果 os.environ 获取系统环境变量 #path系列,和路径相关 os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值,即os.path.split(path)的第二个元素。 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是绝对路径,返回True os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间 os.path.getsize(path) 返回path的大小 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取当前目录的父目录字符串名:('..')
注意:os.stat('path/filename') 获取文件/目录信息 的结构说明
stat 结构: st_mode: inode 保护模式 st_ino: inode 节点号。 st_dev: inode 驻留的设备。 st_nlink: inode 的链接数。 st_uid: 所有者的用户ID。 st_gid: 所有者的组ID。 st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。 st_atime: 上次访问的时间。 st_mtime: 最后一次修改的时间。 st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
sys模块是与python解释器交互的一个接口
sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) sys.version 获取Python解释程序的版本信息 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称
import hashlib md5 = hashlib.md5() md5.update('how'.encode('utf-8')) print(md5.hexdigest()) 结果:db88a0257c220dbfdd2e40f6152d6a8d
如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:
import hashlib md5 = hashlib.md5() md5.update('how你好啊,我不好'.encode('utf-8')) print(md5.hexdigest()) 结果:3bfa4bfb7b59a59f27c24ebdd89cd13c import hashlib md5 = hashlib.md5() md5.update('how'.encode('utf-8')) md5.update('你好啊,我不好'.encode('utf-8')) print(md5.hexdigest()) 结果:3bfa4bfb7b59a59f27c24ebdd89cd13c
MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:
import hashlib sha1 = hashlib.sha1() sha1.update('how to use sha1 in'.encode('utf-8')) sha1.update('python hashlib?'.encode('utf-8')) print(sha1.hexdigest()) 结果:86e1eae2a08c152d39b55baed085c71a0cc9d10b
'e10adc3949ba59abbe56e057f20f883e': '123456'
'21218cca77804d2ba1922c33e0151105': '888888'
'5f4dcc3b5aa765d61d8327deb882cf99': 'password'
import hashlib md5 = hashlib.md5('salt'.encode('utf-8')) #这是加盐了的 md5.update('how你好啊,我不好'.encode('utf-8')) print(md5.hexdigest()) #结果 49f3d086ef5582b12d294c6f1b1c9dea import hashlib md5 = hashlib.md5() md5.update('how你好啊,我不好'.encode('utf-8')) print(md5.hexdigest()) #结果 3bfa4bfb7b59a59f27c24ebdd89cd13c
我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:
p = (1,2)
from collections import namedtuple point = namedtuple('point',['x','y']) s=[('shu','duoshao'),('shuo','duoshassso')] for i in s: p = point._make(i) print(p) point(x='shu', y='duoshao') point(x='shuo', y='duoshassso')
from collections import namedtuple Point = namedtuple('Point', ['x', 'y']) p = Point(1, 2) print(p.x) 1 print(p.y) 2 print(p) p.x
类似的,如果要用坐标和半径表示一个圆,也可以用namedtuple定义:
namedtuple('名称', [属性list]): Circle = namedtuple('Circle', ['x', 'y', 'r'])
deque
from collections import deque q = deque(['a','b','c']) q.append('o')#尾端追加 q.appendleft('b')#头部追加 print(q) # deque(['b', 'a', 'b', 'c', 'o']) q.pop()#删除尾部 q.popleft()#删除头部 print(q) # deque(['a', 'b', 'c'])
deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。
defaultdict
li = [11,22,33,44,55,77,88,99,90] ls={'ke1':[],'ke2':[]} for i in li: if i >66: ls['ke1'].append(i) else: ls['ke2'].append(i) print(ls)
defaultdict
from collections import defaultdict li = [11,22,33,44,55,77,88,99,90] ls = defaultdict(list) for i in li: if i >66: ls['ke1'].append(i) else: ls['ke2'].append(i) print(ls)
使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
from collections import defaultdict dd = defaultdict(lambda: 'N/A') dd['key1'] = 'abc' dd['key1'] # key1存在 'abc' dd['key2'] # key2不存在,返回默认值 'N/A'
c = Counter('abcdeabcdabcaba') print c 输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
不适用模块时的方法
a ='abcdeabcdabcaba' dic={} for i in a: dic.setdefault(i,0) dic[i]=int(dic[i])+1 print(dic)