常用模块

Posted lifangzheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用模块相关的知识,希望对你有一定的参考价值。

常用模块

序列化

序列化简介

什么是序列化呢?

序列化的本质就是将一种数据结构(如字典、列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列

化。

序列化模块:

? 序列化模块就是将一个常见的数据结构转化成一个特殊的序列,并且这个特殊的序列还可以反解回去。它的主要用途:

文件读写数据,网络传输数据。

json模块与pickle模块区别:

json模块 :(重点

  1. 不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串。(比如Python的一个列表[1, 2, 3]利用json转化成特殊的字符串,然后在编码成bytes发送给php的开发者,php的开发者就可以解码成特殊的字符串,然后在反解成原数组(列表): [1, 2, 3])
  2. json序列化只支持部分Python数据结构:dict,list, tuple,str,int, float,True,False,None

pickle模块:

  1. 只能是Python语言遵循的一种数据转化格式,只能在python语言中使用。
  2. 支持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的特征以及使用要点:

  1. bytes类型数据 ---> 通过hashlib算法 ---> 固定长度的字符串
  2. 不同的bytes类型数据转化成的结果一定不同。
  3. 相同的bytes类型数据转化成的结果一定相同。
  4. 此转化过程不可逆。
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)

以上是关于常用模块的主要内容,如果未能解决你的问题,请参考以下文章

Python——常用模块

ansible使用笔记(二)常用命令使用及常用模块简介

常用模块

python常用模块

常用模块知识

python中常用的模块1