模块导入及常用模块

模块 分为3类,分别为内置模块,第三方模块,自定义模块。以下介绍几个常用的模块。

模块导入顺序及书写顺序

所有的模块导入都应该尽量往上写,

​ 顺序为:内置模块-->第三方扩展模块-->自定义模块

模块不会重复被导入

__ name__

在模块中有一个变量__name__

当我们直接执行这个模块的时候,__name__ =='__main__',

当我们执行其他模块时,在其他模块引用这个模块的时候,这个模块中的__name__='模块的名字'

重命名模块

提高代码的兼容性。

# import time as t

# oracle
# mysql
# if 数据库 == ‘oracle’:
#     import oracle as db
# elif 数据库 == ‘mysql’:
#     import mysql as db

time 模块

格式化时间: 给 人 看的。表示的是普通的字符串形式的时间。

时间戳: float时间 , 给计算机看的。 表示的是从1970年1月1日0:00:00开始按秒计算的偏移量。

结构化时间: 元组, 运算用的。struct_time元组共有九个元素,分别为(年、月、日、时、分、秒、一年中第几周,一年中第几天,夏令时)

# print(time.strftime("%Y-%m-%d %a %H:%M:%S"))  

#year month day HOUR MINUTE SECOND

time.time() 	时间戳

time.sleep() 	延时

time.strftime() 	格式化时间,按照规定的格式 输出时间

time.localtime()    时间戳 --> 结构化时间 。 # 本地时区的
time.localtime().tm_year   等等 取具体的年月份
time.gmtime() # UTC时区的时间

time.strptime('2000-12.31','%Y-%m.%d')  格式化时间 --> 结构化时间

time.strftime('%m/%d/%Y %H:%M:%S',time.localtime(3000000000))  结构化时间 --> 格式化时间

不同时间格式的转换

datetime 模块

datetime模块一般用于时间的加减。

print(datetime.datetime.now()) # 返回当前时间

print(datetime.date.fromtimestamp(time.time())) # 返回 年-月-日

# 时间的加减--timedelta() 参数默认为days
print(datetime.datetime.now()+datetime.timedelta(3)) # 在当前时间上+3天
print(datetime.datetime.now()+datetime.timedelta(-3)) # 在当前时间上-3天

# 加减小时。传hours=3即+3小时,hours=-3 即减3小时

# 加减分钟 。同小时

# 时间替换
c_time = datetime.datetime.now()
print(c_time.replace(hour=2,second=3,minute=1))

random模块

这个模块 主要用于生成随机字符。

玩游戏掷骰子、随机验证码,抽奖系统都可以使用这个模块进行开发编程。

开发过程中,经常用到的知识点如下:

# 字母 = chr(数字) # 可以用此来开发一个数字和字母混杂的随机验证码

import random

print(random.random()) # 返回的是0到1之间的小数

print(random.randint(1,3)) # 返回的是 大于1且小于等于3之间的额整数

print(random.randrange(1,4)) # 返回的是 大于1且小于4之间的整数

print(random.uniform(1,3)) # 返回的是 大于1 小于3 的小数

print(random.choice([1,23,4,5,6])) # 返回的是列表中的任意一个元素

print(random.sample([1,2,4],n)) # 以列表形式返回列表中任意n个元素的组合。n不能大于列表的长度

lis = [1,3,4,5,7,8]
random.shuffle(lis) # 打乱lis内元素的顺序,相当于洗牌
print(lis)

os模块

负责程序与操作系统交互,多用于文件处理.

当前文件可以使用 内置变量 __file__

os.getcwd()                 # 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")         # 改变当前脚本工作目录;相当于shell下cd
os.curdir                   # 返回当前目录: ('.')
os.pardir                   # 获取当前目录的父目录字符串名:('..')
os.makedirs('dir1/dir2')    # 可生成多层递归目录
os.removedirs('dirname1')   # 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')         # 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')         # 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')       # 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove()                 # 删除一个文件
os.rename("oldname","new")  # 重命名文件/目录
os.stat('path/filename')    # 获取文件/目录信息
os.sep                      # 操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep                  # 当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep                  # 用于分割文件路径的字符串
os.name                     # 字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command")   # 运行shell命令,直接显示
os.environ                  # 获取系统环境变量
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的大小

sys模块

用于提供对python解释器相关的操作

sys.argv           # 命令行参数List,第一个元素是程序本身路径
sys.exit(n)        # 退出程序,正常退出时exit(0)
sys.version        # 获取Python解释程序的版本信息
sys.maxint         # 最大的Int值
sys.path           # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform       # 返回操作系统平台名称
sys.stdin          # 标准输入
sys.stdout         # 标准输出
sys.stderror       # 错误输出
sys.modules		   # 已导入的模块,以字典形式返回

sys.argv 举例:

ret = sys.argv
name = ret[1]
pwd = ret[2]
if name == 'alex' and pwd == 'alex3714':
    print('登陆成功')
else:
    print("错误的用户名和密码")
    sys.exit()
print('你可以使用计算器了')

collections模块

namedtuple 命名元组

# from collections import namedtuple
# Point = namedtuple('point',['x','y','z'])
# p1 = Point(1,2,3)
# p2 = Point(3,2,1)
# print(p1.x)
# print(p1.y)
# print(p1,p2)

纸牌花色和数字

from collections import namedtuple

Card = namedtuple('card', ['suits', 'number'])
c1 = Card('红桃', 2)
print(c1)
print(c1.number)
print(c1.suits)

queue 队列

先进先出,里面的数据取完后,会阻塞在那里,不继续往下执行。

import queue

q = queue.Queue()
q.put([1,2])
q.put(3)
q.put(4)

print(q.get()) # [1,2]
print(q.get()) # 3
print(q.get()) # 4
print(q.get()) # 阻塞
print(q.qsize()) # 打印当前队列中剩余的元素数量

deque 双端队列

两端都可以存取

from collections import deque

dq = deque([1,2]) # deque([1, 2])
dq.append(3) # deque([1, 2, 3]) 从后面放入数据
dq.appendleft(0) # deque([0, 1, 2, 3]) 从前面放入数据
dq.insert(2,4) # deque([0, 1, 4, 2, 3]) 在指定位置插入数据
dq.pop() # deque([0, 1, 4, 2]) 从后面取数据
dq.popleft() # deque([ 1, 4, 2]) 从前面取数据

print(dq)

有序字典 OrderedDict

from collections import  OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od) # OrderedDict的Key是有序的
print(od['a'])
for k in od:
    print(k)

默认字典 defaultdict

from collections import defaultdict
d = defaultdict(lambda : 5)
# d['k'] = 4
print(d['k'])

json模块 和 pickle 模块

把某个数据类型转化为字符串的过程称之为序列化。

序列化的优点:

  1. 持久保存。内存只是临时保存数据的,无法永久保存。当我们断电或者重启程序,内存中关于这个程序的之前的数据都会被清空。但是如果我们在断电或重启程序前将所需的数据都保存到文件中,下次还可以再从文件中取出之前保存的数据,然后执行,这就是序列化。
  2. 跨平台交互。序列化不仅可以把序列化后的数据保存到文件写入硬盘,还可以通过网络传输的方式发送给别人的程序,如果发送数据和接受数据的双方约定好使用一种序列化的格式,那么便打破了平台、语言化差异带来的限制。实现跨平台数据的交互。

json模块

其他编程语言也在用,序列化出的数据其他语言也能用。

  1. 只能很少一部分的数据类型可以使用json转化为字符串,如数字,字符串,列表,字典,元组。
  2. 通用的序列化格式
# 代码演示
# 序列化后的数据保存到内存中dumps(),取loads()
import json

struct_data = {
    0:'name',
    1:'age',
    2:'sex'
}
# 序列化
data = json.dumps(struct_data) # 将字典序列化成字符串,保存到内存中去
print(data,type(data))# {"0": "name", "1": "age", "2": "sex"} <class 'str'>

# 注意:无论数据是怎样创建的,只要满足json格式(如果是字典,则字典内元素都是双引号),就可以json.loads出来,不一定非要dumps的数据才能loads出来

# 反序列化
data = json.loads(data)
print(data,type(data)) # {'0': 'name', '1': 'age', '2': 'sex'} <class 'dict'>

# 序列化的数据保存到文件中json.dump(data,obj)
# 取数据 json.load(obj)
import json

struct_data = {
    0:'name',
    1:'age',
    2:'sex'
}

# 序列化
with open('json序列化.txt','w',encoding='utf8') as f:
    json.dump(struct_data,f)
    
 # 反序列化
with open('json序列化.txt','r',encoding='utf8') as f:
    data = json.load(f)
print(data)

关于f-string格式化

f-string 格式化也可以将字典以字符串的形式写进文件中,但是写入的 字典 不符合 字典内元素都是用双引号的要求,所以无法将从文件中读取出的字符串形式的字典转化为字典类型。json也无法load出这个字典。

pickle模块

pickle序列化只能是python自己使用。相对于json的优点,就是可以序列化python中的所有数据类型,包括对象。

  1. 只能python自己使用
  2. 可以序列化python中的所有数据类型,包括对象
  3. 序列化保存到文件中的数据是二进制形式。无法读懂。
# 代码演示
# 保存到内存中
import pickle

struct_data = {
    0:'name',
    1:'age',
    2:'sex'
}

# 序列化
data = pickle.dumps(struct_data) 
print(data,type(data)) # 二进制类型

# 反序列化
data = pickle.loads(data) 
print(data,type(data)) # 字典类型
# 代码演示
# 保存到文件中

import pickle

struct_data = {
    0:'name',
    1:'age',
    2:'sex'
}

# 序列化(注意:pickle模块需要使用二进制存储,即wb 模式存储)
with open('pickle序列化.txt','wb',encoding='utf8') as f:
    pickle.dump(struct_data,f)
    
# 反序列化
with open('pickle序列化.txt','rb',encoding='utf8') as f:
    data = pickle.load(f)
print(data)

从上方的代码演示可以看出,json和pickle使用方式一样,只是pickle在dump和load的时候操作文件都是以二进制的模式进行的。

hashlib模块

这个模块主要用于明文加密

hash是什么

hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值。

hash值的特点:

  1. 知道传入的内容一样,得到的hash值一样,可用于非明文密码传输时密码校验
  2. 不能由hash值反解成内容,即可以保证非明文密码的安全性。
  3. 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的,可以用于对文本的hash处理。
# 代码演示

import hashlib

m = hashlib.md5()

m.update('hello'.encode('utf8'))
print(m.hexdigest())

在网络中存在以撞库形式来破解密码的,为了防止密码被撞库,我们可以使用另一个hmac模块,它内部对我们创建key和内容做过某种处理后再加密。

# 如果要保证hmac模块最终结果一致,必须保证:
# 	1. hmac.new()括号内指定的初始key一样
# 	2. 无论update多少次,检验的内容累加到一起是一样的内容

import hmac

h1 = hmac.new(b'hash')
print(h1,type(h1))
h1.update(b'hello')
h1.update(b'world')
print(h1.hexdigest()) # 905f549c5722b5850d602862c34a763e

h2 = hmac.new(b'hash')
h2.update(b'helloworld')
print(h2.hexdigest()) # 905f549c5722b5850d602862c34a763e

logging模块

记录日志使用的模块

posted @ 2019-06-10 10:38  Yaco_Chen  阅读(205)  评论(0编辑  收藏  举报