常用模块

常用模块

什么是模块 

在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码会越来越长,越来越不容易维护。

为了编写可维护的代码,我们把很多的函数分组,分别放到不同的文件里,这样每个文件包含的代码就相对较少了,很多编程语言都采用了这种组织代码的方式。在Python中,一个.py文件就可以称之为一个模块 module

模块分为三种:

内置标准模块(又称标准库),执行help(‘modules‘) 查看所有Python自带模块列表

第三方开源模块,可通过pip install 模块名    联网安装

自定义模块,自己写的模块

 

模块 导入&调用 

Import module  # 导入

 

import os ,sys

print(os.path)
from os import path     #直接导入path模块,直接使用path,无需os.path
print(path)

 


from asyncio.events import get_event_loop as get_events     #as想当于重命名
print(get_events())
模块导入

自定义模块

Module_custom.py

 

name = 'alex'
print('hello',name)

def sayhi(n):
    print('hi',n)

Module_importcustom.py

import Modules.Module_custom as name


name.sayhi('jack')
DIY模块

安装第三方模块

开源的Python镜像网站  

pypi.org

pypi.douban.com/simple     豆瓣的使用方法 pip install -i http://pypi.douban.com/simple/ paramiko

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('10.3.10.241',22,'deepin','deepin1')

stdin,stdout,stderr = ssh.exec_command('ip add')
print(stdout.read().decode('utf-8'))
ssh.close()
paramiko

 

Sys、os模块的使用

# -*- coding:utf-8 -*-
import os
print(__file__)   # 打印一个当前脚本的路径
print(os.getcwd())    # 获取当前脚本的目录pwd
print(os.listdir("/tmp"))   #、获取/tmp目录下的文件

os.path.isfile('/tmp/abc')  # 判断/tmp/abc 是否是一个文件
os.path.isdir('/tmp')  # 判断/tmp 是否是一个目录

os.path.isabs('~/ccn')         #判断一个文件是不是绝对路径
os.path.split("/tmp/abc")  # 提取出目录名,文件名  分开显示
os.path.dirname("/tmp/abc")  # 只获取目录名 ,不获取文件名

os.path.abspath("~/ccn")    #获取绝对路径

os.stat("/tmp")   # 获取/tmp文件属性  相当于 linux下的stat
os.chmod('/tmp')   #修改/tmp权限  相当于linux下chmod功能一样

os.kill(123,9)     #杀死相关进程 前边是进程号 后边是kill的信号 相当于linux下的kill -9
OS模块的常用方法
import sys
sys.argv   # 命令行参数list ,第一个元素是程序本身路径
sys.exit(0)   # 退出程序 ,正常退出时exit(0)
sys.version  # 获取Python解释程序的版本信息
sys.maxint   # 最大的int值
sys.path      #返回模块Module的搜索路径
sys.platform  #返回操作系统平台的名称

sys.getrecursionlimit()   # 获取最大递归层数  default 100
sys.setrecursionlimit(1500)     #设置最大递归层数 1500

sys.getdefaultencoding()   #获取解释器 使用的默认编码 utf8
sys.getfilesystemencoding()  # 获取数据存储到文件里的默认编码  utf8
sys模块常用方法

时间模块

时间处理归为三种:

时间的显示 , 在屏幕显示、记录日志等

时间的转换 , 比如把字符串格式的日期转换成Python中的日期类型

时间的运算,计算两个日期间的差值等

time模块

1.时间戳 ,表示的1970年1月1日0.0.0分

2.格式化的时间字符串,比如’2020-10.03 10:00’

3.元祖共九个元素,由于Python的time模块实现主要调用的c库,平台上不一样

UTF 时间

UTF世界标准时间, 中国为UTF+8,又称东8区

time模块的方法(以上都可以传时间秒数的参数,如果不传默认使用的是系统的时间戳)

Time.localtime()  # 将秒数转化成 年的方法-  正常显示的时间

Time.getime()    # 将时间转换成世界时间

Time.mktime()    # 将时间时间转化成时间戳(秒数)

Time.sleep()    # 延时五分钟

time.asctime()  #把一个表示时间的元祖或者世界时间表示为这种形式:Fri Mar 27 22:46:17 2020

Time.ctime()    #把一个时间戳转换成time.asctime()的形式

Time.strftime()  #  将时间转换成你想要的字符串格式  print(time.strftime("%Y-%m-%d",time.localtime()))

Time.strptime()      #将字符串格式转换成日期print(time.strptime("2020.1.2 10:10","%Y.%m.%d %H:%M"))

Datetime 模块

Datetime模块定义了下面的这几类:

Datetime.data 表示日期的一个类

datetime.date.today()

datetime.date(2020, 3, 27)

datetime.date.fromtimestamp(1222222222)      #将时间戳转换成时间

datetime.date(2008, 9, 24)

Datetime.time  表示时间的类

Datetime.datetime 表示日期时间的类型

datetime.datetime.now()

datetime.datetime(2020, 3, 27, 23, 5, 37, 909430)

datetime.datetime.fromtimestamp(123455)

datetime.datetime(1970, 1, 2, 18, 17, 35)

t1 = datetime.datetime.now()

t1 - datetime.timedelta(days=3)

datetime.datetime(2020, 3, 24, 23, 8, 55, 386942)

datetime.datetime.now().replace(year=20,month=10,day=5,minute=1,hour=1)

datetime.datetime(20, 10, 5, 1, 1, 31, 412669)

Pytz模块

Pytz.alltimezones  查看所有时区

Datetime.datetime.now(tz = pytz.timezone(“Africa/Abidjan”))

Random随机数模块

# -*- coding:utf-8 -*-

import random

import string

print(random.randrange(1,10))    # 返回1-10之间的一个随机数,不包括10
print(random.randint(1,10))   # 返回1-10之间的一个随机数,包括10

print(random.random())    # 返回一个随机浮点数,小数
print(random.choice('qwrrqtyeywy'))   #返回给定字符串中的随机一个字符

print(random.sample('3143445sfwrqrt',4))  #返回给定字符串中,4个随机字符,以列表形式显示


print("".join(random.sample(string.digits+string.ascii_lowercase+string.ascii_uppercase,4)))   # 生成随机4位验证码

a = list(string.digits+string.ascii_lowercase+string.ascii_uppercase)    #洗牌将数字大小写英文 使用shuffle打乱顺序
random.shuffle(a)
print(a)
Random 模块

序列化pickle & json模块

Pickle          ----pickle 可以多次dump 多次load  但建议只一次

# -*- coding:utf-8 -*-

import pickle

d = {
    "name":"alex",
    "role":"police",
    "blood":"76",
    "weapon":"AK47"
}
arrive_players = ["alex","jack","rain" ]


# d_dump = pickle.dumps(d)  # dumps叫做序列化,将不同的数据类型,转换成bytes格式,存入硬盘
# print(d_dump)
#
# print(pickle.loads(d_dump)) #loads叫做反序列化,将bytes字节类型转换成相应的数据类型
#

f = open("game.pkl","wb")   #存入的是16进制数,所以用wb格式
pickle.dump(d,f)     # pickle.dump 方法直接可以序列化的存入文件内

pickle.dump(arrive_players,f)

f = open("game.pkl","rb")    # 因为存入的是进制数,所以取也要用rb模式取
print(pickle.load(f))       # pickle.load将序列化的数据读取出来,序列化了几次就要取几次
print(pickle.load(f))

# dump是写入文件,dumps是在内存中生成序列化的字符串
# load从文件加载,反序列化, loads把序列化的字符串反向解析  建议只dump一次,否则程序多会乱

Json    ------json 一个文件只能一次dump ,一次load

import json

d = {
    "name":"alex",
    "role":"police",
    "blood":"76",
    "weapon":"AK47"
}
arrive_players = ["alex","jack","rain" ]

#print(json.dumps(d))
f = open("game.json",'w')
json.dump(d,f)
#json.dump(arrive_players,f)


f = open("game.json",'r')
print(json.load(f))

Pickle 和 json的区别

Pickle只支持python,支持所有的数据类型  时间都可以

json 支持所有变成语言 .只支持常规的数据类型str . int .dict.set . list .tuple

 

Hashlib加密模块

Md5功能 

输入任意长度的信息,经过处理,输出为128位的信息(数字指纹):

不同的输入得到的不同的结果(唯一性)

Md5算法的特点

1. 压缩性:任意长度的数据,算出的md5值的长度都是固定的.

2. 容易计算:从元数据计算出md5值很容易

3. 抗修改性:对源数据进行任何改动,修改一个字节生成的md5值区别也很大

4. 强抗碰撞: 已知原数据和md5,想找到一个具有相同md5值的数据(即伪造数据)是非常困难的.

Md5算法是否可逆

Md5不可逆的原因是一种散列函数,使用的hash算法,在计算过程中原文的部分信息是丢失了的.

Md5的用途

1. 防止被篡改

2. 防止直接看到明文

3. 防止抵赖(数字签名)

import hashlib

m = hashlib.md5()
m.update(b"hello alex")
print(m.hexdigest())
m.update("房纠纷解决".encode("utf8"))

#print(m.digest())
print(m.hexdigest())

Hashlib -- sha加密算法

s1 = hashlib.sha1()

s1.update('发发发'.encode("utf-8"))

s1.hexdigest()

'22b90f88377478e852388db42b707488ed8cf3c9'

s2 = hashlib.sha3_256()

s2.update("嘻嘻".encode("utf-8"))

s2.hexdigest()

'd3b4813643938fb3cf57b775c947dd638b59f60bcc9258ed400b6e0fbbf5a925'

文件copy模块shutil

import shutil

shutil.copyfileobj(open("game.json"),open("game2.json",'w'))

shutil.copyfile("game.json","game3.json")

shutil.copymode()   #仅copy权限,内容组用户均不变 不会copy内容,目标文件必须存在

shutil.copystat()   #仅copy状态的信息 mtime ctime atime,不会copy内容,目标文件必须存在

shutil.copy()     #copy权限和内容

shutil.copy2()    # copy权限和状态的信息  

shutil.copytree()    #copy整个目录

shutil.copytree("../Modules","Modules_cpoy",ignore=shutil.ignore_patterns("*.py","*.pkl"))  # ignore排除相应文件进行copy

shutil.rmtree()   # 删除文件

shutil.move()    #移动文件



shutil.make_archive(base_name="/tmp/code.bak",format="zip",root_dir="../Modules",owner="root")       #创建压缩包

Zipfile 压缩模块

import zipfile
import os
z = zipfile.ZipFile("/tmp/test_copy.zip","w")  #压缩
filelist = []

for root_dir,dirs,files in os.walk("../Modules"):  #.代表当前目录
    for name in files:
        filelist.append(os.path.join(root_dir,name))
for i in filelist:
    print(i)
    z.write(i)
z.close()


z = zipfile.ZipFile("/tmp/test_copy.zip",'r')   #解压
z.extractall(path="/root")
z.close()

牛逼的Re正则模块

Re.match   从头开始匹配

Re.findall   匹配所有值  匹配出所有的值以列表返回

Re.search   包含匹配 匹配出来第一个就返回

Re.split  以匹配到的字符当做列表分隔符 re.split("[0-9]","alex3jack4rain5mack") ['alex', 'jack', 'rain', 'mack']

Re.sub  匹配字符并替换 re.sub("abc","ABc","abcabcerrr")   'ABcABcerrr'

re.sub("abc","ABc","abcabcerrr",count=1)  'ABcabcerrr'

Re.fullmatch j精确匹配

re.fullmatch("abc","abc")  相当于re.search("^abc$",”abc”)

'.'  匹配任意除 之外的任意字符

'^' 匹配开头

$' 匹配结尾

'*'  匹配前一个字符0次或多次

'+' 匹配前一个字符1次或多次

'?' 匹配前一个字符0次或1次

'{m}' 匹配前一个字符m次

'{n,m}' 匹配前一个字符n次到m次

'{|}'  匹配或

'{}'分组匹配 re.search(“(abc){1}a(123|45)”,”abcabca12345”)

A'只从字符开头匹配

' 相当于$ 匹配字符结尾 re.search("Aabc","abc")  只能是abc

[]      re.search("[a-zA-z0-9]{11}","131414fsq3144f")

d'  匹配数字0-9  re.search("d+","d3425")  +一次或多次 ?一次或0次 0一次或多次

D'  匹配非数字   re.findall("D+","1324fs1sadf31fds")

w'  re.search("w+","123qrt135")   匹配[a-zA-z0-9]

W'  匹配非[a-zA-z0-9] 

s'匹配 空白字符 

a= re.search("(?P<province>[0-9]{3})(?P<city>[0-9]{3})(?P<birt>[0-9]{4})",id_num)

a.group()

'1504301998'

a.groups()

('150', '430', '1998')

a.groupdict() re.split("[0-9]","alex3jack4rain5mack")

['alex', 'jack', 'rain', 'mack']

{'province': '150', 'city': '430', 'birt': '1998'}

Re.compile  制定匹配规则 ,直接拿来用.适合非常大的数据量,匹配规则还是一样的

p = re.compile("w{11}")

p.search("1234567892134658")

<re.Match object; span=(0, 11), match='12345678921'>

Flags 标志符

re.search("elf","alexrwfElf",re.I)   re.I忽略大小写

re.search("^alex"," alexjackrain",re.M)

<re.Match object; span=(1, 5), match='alex'>   re.M多行模式 search只搜索第一行

re.search("."," ",re.S)       re.S 可以匹配

软件项目的目录设计规范

目的:

1. 可读性高 

2. 可维护性高

Bin/ 存放项目的一些可执行文件 脚本之类的

Docs/存放,使用的文档

Conf/ 存放配置文件

Setup.py  安装 部署 打包的脚本

Requirements.txt 存放软件依赖的外部python包列表 自动生成这个文件 pip freeze > requirements.txt   使用这个文件 pip install -r requirements.txt

README  项目说明文件

Bin/ 存放项目的一些可执行文件 脚本之类的

Test/  存放目录的源代码

Docs/存放,使用的文档

Conf/ 存放配置文件

Setup.py  安装 部署 打包的脚本

Requirements.txt 存放软件依赖的外部python包列表 自动生成这个文件 pip freeze > requirements.txt   使用这个文件 pip install -r requirements.txt

README  项目说明文件

包&跨模块代码调用

>>> import mypackage

------welcome invoke my first package

>>> from mypackage import fir

哈哈

原文地址:https://www.cnblogs.com/zjaiccn/p/12910126.html