常用模块
Posted lifangzheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用模块相关的知识,希望对你有一定的参考价值。
常用模块
序列化
序列化简介
什么是序列化呢?
序列化的本质就是将一种数据结构(如字典、列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列
化。
序列化模块:
? 序列化模块就是将一个常见的数据结构转化成一个特殊的序列,并且这个特殊的序列还可以反解回去。它的主要用途:
文件读写数据,网络传输数据。
json模块与pickle模块区别:
json模块 :(重点)
- 不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串。(比如Python的一个列表[1, 2, 3]利用json转化成特殊的字符串,然后在编码成bytes发送给php的开发者,php的开发者就可以解码成特殊的字符串,然后在反解成原数组(列表): [1, 2, 3])
- json序列化只支持部分Python数据结构:dict,list, tuple,str,int, float,True,False,None
pickle模块:
- 只能是Python语言遵循的一种数据转化格式,只能在python语言中使用。
- 支持Python所有的数据类型包括实例化对象。
json:
json模块是将满足条件的数据结构转化成特殊的字符串,并且也可以反序列化还原回去。
# dumps loads
import json
lit =[1,22,3,3,45] # 字典操作
print(json.dumps(lit),type(json.dumps(lit)))
lst_str = json.dumps(lit) # 将列表转化成字符串类型
lst = json.loads(lst_str) # 将字符串类型转化成列表类型
print(lst,type(lst))
# 结果:
[1, 22, 3, 3, 45] <class 'str'>
[1, 22, 3, 3, 45] <class 'list'>
dic = 'name':"宝元"
str_dic = json.dumps(dic) # 以字节方式返回数据
print(str_dic)
str_dic = json.dumps(dic,ensure_ascii=False) # 关闭ascii码
print(str_dic,type(str_dic))
dic1 = json.loads(str_dic)
print(dic1,dic1['name'])
# 结果:
"name": "\u5b9d\u5143"
"name": "宝元" <class 'str'>
'name': '宝元' 宝元
# dump load
import json
f = open('json_file.json','w')
dic = 'k1':'v1','k2':'v2','k3':'v3'
json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
f.close()
# json文件也是文件,就是专门存储json字符串的文件。
import json
f = open('json_file.json','r')
dic2 = json.load(f) #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
f.close()
print(type(dic2),dic2)
<claass,'dict'> 'k1':'v1','k2':'v','k3':'v3'
json中的相关参数:
ensure_ascii
:,当它为True的时候,所有非ASCII码字符显示为\uXXXX序列,只需在dump时将ensure_ascii设置为False即可,此时存入json的中文即可正常显示。
separators
:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(,,:);这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。
sort_keys
:将数据根据keys的值进行排序。
json序列化存储多个数据到同一个文件:
dic1 = 'name':'oldboy1'
dic2 = 'name':'oldboy2'
dic3 = 'name':'oldboy3'
f = open('序列化',encoding='utf-8',mode='a')
str1 = json.dumps(dic1)
f.write(str1+'\n')
str2 = json.dumps(dic2)
f.write(str2+'\n')
str3 = json.dumps(dic3)
f.write(str3+'\n')
f.close()
f = open('序列化',encoding='utf-8')
for line in f:
print(json.loads(line)) # 逐行读取字符串操作处理
pickle:
pickle模块是将Python所有的数据结构以及对象等转化成bytes类型,然后还可以反序列化还原回去。
# dumps loads
import pickle
dic = 'k1':'v1','k2':'v2','k3':'v3'
str_dic = pickle.dumps(dic)
print(str_dic) # bytes类型
dic2 = pickle.loads(str_dic)
print(dic2) #字典
# 序列化对象
import pickle
def func():
print(666)
ret = pickle.dumps(func)
print(ret,type(ret)) # b'\x80\x03c__main__\nfunc\nq\x00.' <class 'bytes'>
f1 = pickle.loads(ret) # f1得到 func函数的内存地址
f1() # 执行func函数
# dump load
dic = (1,2):'oldboy',1:True,'set':1,2,3
f = open('pick序列化',mode='wb')
pickle.dump(dic,f)
f.close()
with open('pick序列化',mode='wb') as f1:
pickle.dump(dic,f1)
pickle序列化存储多个数据到一个文件中
dic1 = 'name':'oldboy1'
dic2 = 'name':'oldboy2'
dic3 = 'name':'oldboy3'
f = open('pick多数据',mode='wb')
pickle.dump(dic1,f)
pickle.dump(dic2,f)
pickle.dump(dic3,f)
f.close()
f = open('pick多数据',mode='rb')
while True:
try:
print(pickle.load(f))
except EOFError:
break
f.close()
os
os模块是与操作系统交互的一个接口,它提供的功能多与工作目录,路径,文件等相关。
当前执行这个python文件的工作目录相关的工作路径
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 ***
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd **
os.curdir 返回当前目录: ('.') **
os.pardir 获取当前目录的父目录字符串名:('..') **
文件夹相关
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.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.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" *
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: *
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' *
# 和执行系统命令相关
os.system("bash command") 运行shell命令,直接显示 **
os.popen("bash command).read() 运行shell命令,获取执行结果 **
os.environ 获取系统环境变量 **
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)是创建时间(详细信息参见平台的文档)。
os模块重点记忆内容:
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 ***
os.makedirs('dirname1/dirname2') 可生成多层递归目录 ***
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 ***
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname ***
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname ***
os.remove() 删除一个文件 ***
os.rename("oldname","newname") 重命名文件/目录 ***
os.path.abspath(path) 返回path规范化的绝对路径 ***
os.path.split(path) 将path分割成目录和文件名二元组返回 ***
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False ***
os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False ***
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 ***
os.path.getsize(path) 返回path的大小 ***(不准)
sys
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version 获取Python解释程序的版本信息
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 ***
sys.platform 返回操作系统平台名称
import sys # 可指定argv参数
if sys.argv[-1] == "alex":
print("dsb")
else:
print("大帅比")
print(sys.argv[-1]) # 在terminal中运行
import sys
print(sys.exit(1)) # 可用于异常捕获
import sys
print(sys.version) # 获取解释器版本
import sys
print(sys.path) # 添加自定义模块查找路径 *****
import sys
print(sys.platform) # *** 区分操作系统然后进行相关逻辑操作
hashlib
哈希算法,又叫摘要算法
哈希算法的用途:1、加密 2、文件一致性校验
加密种类:MD5 sha1 sha224 sha224 sha256 sha384 sha512
hashlib的特征以及使用要点:
- bytes类型数据 ---> 通过hashlib算法 ---> 固定长度的字符串
- 不同的bytes类型数据转化成的结果一定不同。
- 相同的bytes类型数据转化成的结果一定相同。
- 此转化过程不可逆。
import hashlib
md5 = hashlib.md5() # 前一个MD5为变量,可进行替换
md5.update('12345'.encode('utf-8')) # "12345"为固定盐 可根据用户名加可变盐
print(md5.hexdigest())
校验Pyhton解释器的Md5值是否相同
import hashlib
def file_check(file_path):
with open(file_path,mode='rb') as f1:
sha256 = hashlib.md5()
while 1:
content = f1.read(1024)
if content:
sha256.update(content)
else:
return sha256.hexdigest()
print(file_check('python-3.6.6-amd64.exe'))
collections
在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。
1.namedtuple: 生成可以使用名字来访问元素内容的tuple
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
3.Counter: 计数器,主要用来计数
4.OrderedDict: 有序字典
5.defaultdict: 带有默认值的字典
namedtuple:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print(p)
# 结果:Point(x=1, y=2) 运用命名元组定义一个坐标点
deque:
from collections import deque
q = deque(['a', 'b', 'c']
q.append('x')
q.appendleft('y') # 双端队列添加了从左边添加删除的操作
q
deque(['y', 'a', 'b', 'c', 'x'])
Counter:(可用于计数)
c = Counter('abcdeabcdabcaba')
print c
输出:Counter('a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1)
OrderedDict:
from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3)]) # 另一种定义字典的方式
print(d)
# 结果:
'a': 1, 'c': 3, 'b': 2
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od)
# 结果:
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
defaultdict:
li = [11,22,33,44,55,77,88,99,90]
result =
for row in li:
if row > 66:
if 'key1' not in result:
result['key1'] = []
result['key1'].append(row)
else:
if 'key2' not in result:
result['key2'] = []
result['key2'].append(row)
print(result)
from collections import defaultdict
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = defaultdict(list)
for value in values:
if value>66:
my_dict['k1'].append(value)
else:
my_dict['k2'].append(value)
以上是关于常用模块的主要内容,如果未能解决你的问题,请参考以下文章