Python模块——标准库\开源模块\自定义模块

一、定义

        模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件。

        包:用来从逻辑上组织模块,本质就是一个目录(必须有一个__init__.py文件)

二、导入方法

        import module_name

        import module1_name,module2_name

        from module import *(不建议使用)

        from module import 方法名 as 别名

三、import本质(路径搜索和搜索路径)

        import 模块名

        第一种直接import 模块名的,当需要使用模块里的类、函数、变量等时,需要模块名字+类/函数/变量,表示你要使用这个模块下的类、函数、变量等,需要指定一下。实际上这种方式相当于把  “模块名.py”  这个文件中的所有类、函数、常量、变量全都解释一遍赋值给  “模块名”。

        from 模块名 import xxx (xxx可以是类,函数,常量等等)

        第二种from 模块名 import xxx,这种直接使用模块下的某一个类,这样一次只能导入一个特定的类/函数/变量等,如果还想使用这个模块下的其他类,就得继续这样导入。实际上这种方式相当于直接把 “xxx” 这部分代码拿到当前文件下执行。

        导入模块的本质就是把python文件解释一遍,导入包的本质就是执行该包下的__init__.py文件。

四、导入优化

import 模块名
def test1():
    模块名.方法名() //第一次调用
    print("in the test1")

def test2():
    模块名.方法名() //第二次调用
    print("in the test2")

//上述两段函数重复调用同一个方法,效率降低,如何优化?
from 模块名 import 方法名
def test1():
    方法名() 
    print("in the test1")

def test2():
    方法名() 
    print("in the test2")

五、模块的分类

       1.标准库

       a、time & datetime 模块

       时间相关的操作,时间有三种表示方式:

       ①时间戳               1970年1月1日之后的秒,即:time.time()

       ②格式化的字符串    2019-11-11 11:11,    即:time.strftime('%Y-%m-%d')

       ③结构化时间          元组包含了:年、日、星期等... time.struct_time    即:time.localtime()

Python模块——标准库\开源模块\自定义模块_第1张图片

       b、random 模块

import random
print(random.random()) #[0,1)之间的随机浮点数
print(random.randint(1,5)) #random.randint(a,b)用于生成[a,b]范围内的整数
print(random.randrange(1,5)) #random.randrange(start,stop,step),用于按指定步长获得一个[start,stop)a范围内随机数
print(random.choice('hello')) #random.choice()从序列中获取一个随机元素,这里可以是列表、元组、字符串
print(random.sample([1,2,3,4,5],3)) #random.sample(sequence,k),从指定序列中随机获取指定长度的片段

#随机整数
print(random.randint(1,100))
#随机选取0~100之间偶数
print(random.randrange(0,101,2))
#随机浮点数
print(random.random())
print(random.uniform(1,10))
#随机字符
print(random.choice('abcdefg'))
#选取特定数量的字符
print(random.sample('abcdefg',3))
#洗牌
items = [1,2,3,4,5,6]
random.shuffle(items)
print(items)

#4位验证码
import random
checkcode=''
for i in range(4):
    current = random.randrange(0,4)
    #字母
    if current == i:
        tmp = chr(random.randint(65,90))
    #数字
    else:
        tmp = random.randint(0,9)
    checkcode += str(tmp)
print(checkcode)

        c、os 模块

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.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所指向的文件或者目录的最后修改时间

       d、sys 模块

sys.argv           命令行参数List,第一个元素是程序本身路径
sys.exit()        退出程序,正常退出时exit(0)
sys.version        获取Python解释程序的版本信息
sys.maxint         最大的Int值
sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform       返回操作系统平台名称
sys.stdout.write('please:')
val = sys.stdin.readline()[:-1]

       e、shutil 模块

#将文件内容拷贝到另一个文件中,可以部分内容
#shutil.copyfileobj(fsrc, fdst[, length])
import shutil
f1 = open("test",encoding="utf-8")
f2 = open("test1","w",encoding="utf-8")
shutil.copyfileobj(f1,f2)

#拷贝文件
#shutil.copyfile(src, dst)

#仅拷贝权限。内容、组、用户均不变
#shutil.copymode(src, dst)

#拷贝状态的信息,包括:mode bits, atime, mtime, flags
#shutil.copystat(src, dst)

#拷贝文件和权限
#shutil.copy(src, dst)

#拷贝文件和状态信息
#shutil.copy2(src, dst)

#递归的去拷贝文件
#shutil.ignore_patterns(*patterns)
#shutil.copytree(src, dst, symlinks=False, ignore=None)

#递归的去删除文件
#shutil.rmtree(path[, ignore_errors[, onerror]])

#递归的去移动文件
#shutil.move(src, dst)

'''
#创建压缩包并返回文件路径,例如:zip、tar
base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,
如:www                        =>保存至当前路径
如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/
format:	压缩包种类,“zip”, “tar”, “bztar”,“gztar”
root_dir:	要压缩的文件夹路径(默认当前目录)
owner:	用户,默认当前用户
group:	组,默认当前组
logger:	用于记录日志,通常是logging.Logger对象
'''
#shutil.make_archive(base_name, format,...)
# 将 /Users/amax/Downloads/test 下的文件打包放置当前程序目录
import shutil
ret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/amax/Downloads/test')
# 将 /Users/amax/Downloads/test 下的文件打包放置 /Users/amax/目录
import shutil
ret = shutil.make_archive("/Users/amax/wwwwwwwwww", 'gztar', root_dir='/Users/amax/Downloads/test')

       f、json & pickle 模块

        把一个字符串(或字节)保存到磁盘是一件很容易的事情,但是在实际编程中,我们经常要保存结构化的数据,如字典、嵌套列表等等,这时候就需要想办法把结构化数据先转化为字符串,这个转化过程就叫做“序列化”,这一过程的逆操作就是“反序列化”。

       Python语言特定的序列化模块是pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块。

       Json模块提供了四个功能:dumps、dump、loads、load

       pickle模块提供了四个功能:dumps、dump、loads、load

       (见Python IO编程https://blog.csdn.net/xjtuse123/article/details/94554448)

        g、Xml 模块

        xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,在json还没诞生的年代,大家只能选择使用xml。

        h、hashlib模块

        用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法。

import hashlib
 
m = hashlib.md5()
m.update(b"Hello")
m.update(b"It's me")
print(m.digest())
m.update(b"It's been a long time since last time we ...")
 
print(m.digest()) #2进制格式hash
print(len(m.hexdigest())) #16进制格式hash
'''
def digest(self, *args, **kwargs): # real signature unknown
    """ Return the digest value as a string of binary data. """
    pass
 
def hexdigest(self, *args, **kwargs): # real signature unknown
    """ Return the digest value as a string of hexadecimal digits. """
    pass
 
'''
import hashlib
 
# ######## md5 ########
 
hash = hashlib.md5()
hash.update('admin')
print(hash.hexdigest())
 
# ######## sha1 ########
 
hash = hashlib.sha1()
hash.update('admin')
print(hash.hexdigest())
 
# ######## sha256 ########
 
hash = hashlib.sha256()
hash.update('admin')
print(hash.hexdigest())
 
# ######## sha384 ########
 
hash = hashlib.sha384()
hash.update('admin')
print(hash.hexdigest())
 
# ######## sha512 ########
 
hash = hashlib.sha512()
hash.update('admin')
print(hash.hexdigest())

#python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密
import hmac
h = hmac.new(b'bibibibi', '中文'.encode(encoding="utf-8"))
print (h.hexdigest())

        i、re 模块

         常用正则表达式符号

'.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
'^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$'     匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
'*'     匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac")  结果为['abb', 'ab', 'a']
'+'     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
'?'     匹配前一个字符1次或0次
'{m}'   匹配前一个字符m次
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
'|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
 
 
'\A'    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z'    匹配字符结尾,同$
'\d'    匹配数字0-9
'\D'    匹配非数字
'\w'    匹配[A-Za-z0-9]
'\W'    匹配非[A-Za-z0-9]
's'     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
 
'(?P...)' 分组匹配 re.search("(?P[0-9]{4})(?P[0-9]{2})(?P[0-9]{4})","371481199306143242").groupdict("city") 结果{'province': '3714', 'city': '81', 'birthday': '1993'}

        最常用的匹配语法 

re.match    从头开始匹配
re.search   匹配包含
re.findall  把所有匹配到的字符放到以列表中的元素返回
re.splitall 以匹配到的字符当做列表分隔符
re.sub      匹配字符并替换

        反斜杠的困扰
        与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。 

       2.开源模块

        (1)下载安装

#方式一:直接安装
yum
pip
apt-get
...

#方式二:源码安装
下载源码
解压源码 
进入目录
编译源码  python xxx.py build
安装源码  python xxx.py install

        (2)导入模块

        见下3.自定义模块

       3.自定义模块

        (1)导入模块有以下几种方法:

import module
from module.xxx.xxx import xx
from module.xxx.xxx import xx as rename
from module.xxx.xxx import *

导入一个 .py 文件,解释器解释该py文件,导入一个包,解释器解释该包下的__init__.py文件

import os
import sys
'''
print(__file__)#获取当前程序路径,注意:这里打印出来的路径为相对路径
#动态获取绝对路径
print(os.path.abspath(__file__)) #这才是当前程序绝对路径
print(os.path.dirname(os.path.abspath(__file__))) #当前程序上一级目录,其中dirname返回目录名,不要文件名
print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#当前程序上上一级目录
'''
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #当前程序上上一级目录
sys.path.append(BASE_DIR) #添加环境变量
 
import model1
import model2

 

你可能感兴趣的:(Python)