PYTHON之模块

python模块

一、什么是模块

1、模块:其实就是一个py文件;

(1)、模块的分类:

a、python官方库;

b、第三方模块;

c、自定义模块;

(2)、模块的调用(调用多个模块的时候使用逗号隔开)

a、调用方法

import 模块名;

from 模块名 import 变量名

b、路径

导入模块的时候解释器只认知当前执行文件的路径,在导入模块的时候尽量使用from 模块名 import 变量的方式;

import sys
print(sys.path)  ###解释器查找的路径;

c、导入模块的所做的动作:

先查找到文件名;

执行导入的文件;

备注:

a、文件书写规范:if __name__ == "__main__":

在执行文件里面的值为:__main__;

在调用文件里面的值为:被调用文件的路径;该书写规范主要用于被调用文件的测试,用于执行文件不想被别人调用

 b、pycharm中文件夹与package的区别:init.py文件;

 二、时间模块

1、时间戳

import time
print(time.time())   ###1575013743.0178382返回的是以秒为单位

2、结构化时间

import time
#print(time.time())
print(time.localtime()) ##time.struct_time(tm_year=2019, tm_mon=11, tm_mday=29, tm_hour=15, tm_min=52, tm_sec=21, tm_wday=4, tm_yday=333, tm_isdst=0)
print(time.gmtime())   ###time.struct_time(tm_year=2019, tm_mon=11, tm_mday=29, tm_hour=7, tm_min=52, tm_sec=51, tm_wday=4, tm_yday=333, tm_isdst=0)

3、将结构化时间转换为时间戳

print(time.mktime(time.localtime()))  ###1575251849.0

4、将结构化时间转换成字符串时间

print(time.strftime("%Y-%m-%d %X",time.localtime())) ##2019-12-02 10:01:27

5、将字符串时间转换成结构时间

print(time.strptime("2019-11-02 09:30:03","%Y-%m-%d %X")) ###结构化时间成功

6、asctime、ctime

##转换为特定格式
print(time.asctime())   ##默认参数为time.localtime(),参数为结构化时间
print(time.ctime(1565253090.0))  ##默认参数为time.time(),参数为时间戳

备注:集中时间格式之间的转换关系

三、sys模块

time、sys模块都是内置在python解释器中的,都是有c语言实现的,属于同一级别;

###命令行参数list,第一个元素就是程序本身路径
print(sys.argv)  #['D:/python project/python_learning/learning/day22/sys.test.py']
###获取python解释器程序的版本信息
print(sys.version)    ##3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)]
###返回模块的搜索路劲,初始化时环境变量的值
print(sys.path)   ##
###返回操作系统平台名称:
print(sys.platform)   ###win32

 备注:修改环境变量的两种方式:

1、临时添加:

sys.path.append("D:\python project\python_learning")   ##临时添加

2、永久添加:

修改电脑的环境变量

3、获取文件上的上级目录BASE_DIR

###os.path.abspath(__file__)获取文件的绝对路径
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
print(BASE_DIR)
###__file__只是一个文件名,在pycharm中打印的时候pycharm将文件的路径给补齐了。
print(os.path.abspath(__file__)) ###D:\python project\python_learning\learning\day22
print(__file__)###D:\python project\python_learning\learning\day22

四、os模块

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    输出用于分割文件路径的字符串 win下为;,Linux下为:
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所指向的文件或者目录的最后修改时间

 备注:路径拼接使用join尽量不要使用“+”,因为有不用操作系统:在window上可以,在linux系统中就会出现问题;

 五、json pickle模块

1、序列化

我们把对象从内存中变成可存储或可传输的过程称之为序列化,在python中称为pickling;

序列化之后,就可以把序列化后的内容写入磁盘或者通过网络传输到别的机器上;

反过来,把变量内容从序列化的对象重新读取到内存中称之为反序列化,即upickling。

2、JSON

我们要想在不同的编程语言之间传递对象,就必须把对象序列化为标准格式:xml和JSON。

JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对象关系如下:

 json的功能组:dumps/loads  dump/load,主要以dumps/loads为主

无论数据是怎样创建的,只要满足json格式,就可以使用json.loads读取出来,不一定非要dumps的数据才能loads。

import json
dic={'name':'alvin','age':23,'sex':'male'}
j=json.dumps(dic)
print(type(j))#<class 'str'>
f=open('序列化对象','w')
f.write(j)  #-------------------等价于json.dump(dic,f)
f.close()
#-----------------------------反序列化<br>
import json
f=open('序列化对象')
data=json.loads(f.read())#  等价于data=json.load(f)

3、pickle:pickle与json的作用是一样的,只是json后的数据类型为json字符串,而pickle则是字节,是不可读的;json可以用于不同编程语言之间,pickle只能用于python。

 六、XML模块

XML可扩展标记语言,分为自合标签和非自合标签,可以通过for循环去去遍历子节点和属性;

标签:tag;

属性:attrib;

标签实际包裹的内容:text;

1、XML模块的相关功能

import xml.etree.ElementTree as et
tree = et.parse("xml.text")
root = tree.getroot()
print(root.tag)
##1、遍历xml文档
###tag:标签;attrib:属性;text:标签实际包裹的内容
for i in root:
    print(i.tag,i.attrib)
    for j in i:
        print(j.tag,j.attrib,j.text)
##2、只遍历year节点
for i in root.iter("year"):
    print(i.tag,i.text)
##3、修改
for i in root.iter("year"):
    new_year = int(i.text)+1
    i.text = str(new_year)
    i.set("updated","yes")
tree.write("xml_test")  ##重新写入文件

###删除
for i in root.findall("country"):
    rank = int(i.find("rank").text)
    if rank >50:
        root.remove(i)
tree.write("xml_test") 

七、configparser模块

 用于编辑配置文件的模块

import configparser
config = configparser.ConfigParser()
config["Default"]= {"ServerAliveInterval":"45",
                    "compression":"yes",
                    "compressionlevel":9}
config["bitbucket.org"] ={}
config["bitbucket.org"]["user"] = "heaton"

with open("config.ini","w") as configfile:
    config.write(configfile)

 八、hashlib模块

主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

import hashlib
m = hashlib.md5() #m=hashlib.sha256()
m.update("heatonhello".encode("utf-8"))
print(m.hexdigest())  ##aef8d3fd8b44bd96aa0b2826f6362c82


##对加密算法中添加自定义key来做加密
hash = hashlib.sha256("heaton".encode("utf-8"))
hash.update("hello".encode("utf-8"))
print(hash.hexdigest()) ##2cf44f7e1e7173e80bae87536ff4bb8adf270dce2afb52ce36f46c3430c19258

 九、re模块

正则表达式其实就是一种小型的、高度专业化的编程语言,它内嵌在python中,并通过re模块实现。正则表达式模式被编译成一系列的字节码,然后由用c编写的匹配引擎执行。

1、普通字符精确匹配

import re
res = re.findall("heaton","ludouw28heatonoowuoehwk")
print(res)

2、元字符匹配

元字符:.^$*+?{}[]|()\

(1)、元字符:. ^ $ * + ? { }

import re
# res = re.findall("heaton","ludouw28heatonoowuoehwk")
# print(res)
def print_fun(*args):
    print(*args)

###(1)、通配符.
res = re.findall("h....n","oeowuowuheatonouowoow")  ##['heaton']
print_fun(res)

###(2)、首行匹配^
res = re.findall("^h....n","oeowuowuheatonouowoow")
res1 = re.findall("^h....n","heoyunowueowo")  ##[] ['heoyun']
print_fun(res,res1)

###(3)、末尾匹配$
res = re.findall("h....n$","oeowuowuheatonouowoow")
res1 = re.findall("h....n$","dwoieowhwheiiun")  ###[] ['heiiun']
print_fun(res,res1)

###(4)、0到+∞:*
res = re.findall("abc*","abccccoiowiab")##['abcccc', 'ab']
res1 = re.findall("abc*?","abccccoiowiab")  ###['ab', 'ab']
print_fun(res,res1)

###(5)、1到+∞:+
res = re.findall("abc+","abccccoiowiab")###['abcccc']
re1 = re.findall("abc+?","abccccoiowiab") ###['abc']
print_fun(res,res1)

###(6)、0到1:?
res = re.findall("abc?","abccccoiowiab")###['abc', 'ab']
res1= re.findall("abc??","abccccoiowiab")  ###['ab', 'ab']
print_fun(res,res1)

###(7)、大括号可以设置匹配次数{}
res=re.findall('abc{1,4}','abcccccccoiowiab')
print_fun(res)

###备注:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配

2、元字符:字符集:[]

起“或”的作用,在元字符集里面没有特殊字符,除了一下几个字符有特殊意义

备注:有特殊意义的:

"-":a-z,表示所有小写字母;

"^":尖角号,表示非

"\":转义符,把有意义的元字符变为普通字符,把普通字符转为有意义的字符;

import re
res = re.findall("x[yz]","xuyuwoeuosxzyuox*y")
res1 = re.findall("x[y*z]","xuyuwoeuosxzyuox*y")
print(res,res1,res2)

3、元字符:转义符:“\”

(1)、将普通字符转义为有意义的字符:反斜杠后边跟普通字符实现特殊功能:比如\d

import  re
###1、"\d"匹配任何十进制,相当于[0-9]
ret = "zhangsan18 lisi23 wangwu5yuliu23"
res = re.findall("\d",ret)
res1 = re.findall("[0-9]",ret)
print(res,res1)

###2、"\D" 匹配任何非数字字符,相当于类[^0-9]
res = re.findall("\D",ret)
res1 = re.findall("[^0-9]",ret)
print(res,res1)

###3、"\s"匹配任何空白字符,相当于类[\n\n\f\v]
###"\S"匹配任何非空白字符,相当于类[^\n\n\f\v]
res = re.findall("\s",ret)
res1 = re.findall("\S",ret)
print(res,res1)

###4、"\w":匹配任何数字字母字符,相当于[A-Za-z0-9]
###"\W":匹配任何非数字字母字符,相当于[^A-Za-z0-9]
res = re.findall("\w",ret)
res1 = re.findall("\W",ret)
print(res,res1)

###5、\b匹配一个特殊字符边界,比如空格,&,#等
res = re.findall("I\b","hello I am LIST")
res1 = re.findall(r"I\b","hello I am LIST")
res2 = re.findall("I\\b","hello I am LIST")
print(res,res1,res2)

(2)、将有意义的元字符变成普通字符

import  re
res = re.findall("www.baidu","wwwobaidu")
res1 = re.findall("www\.baidu","www.baidu")  ###['wwwobaidu'] ['www.baidu']
print(res,res1)

(3)、转义字符特殊用法

import  re
res = re.findall("www.baidu","wwwobaidu")
res1 = re.findall("www\.baidu","www.baidu")  ###['wwwobaidu'] ['www.baidu']
print(res,res1)
res2 = re.findall("c\\f","adc\fuouk")
res3 = re.findall("c\\\\l","adc\louwe")  ##['c\x0c'] ['c\\l']
print(res2,res3)

4、元字符:分组:()

import  re
res = re.findall("www.baidu","wwwobaidu")
res1 = re.findall("www\.baidu","www.baidu")  ###['wwwobaidu'] ['www.baidu']
print(res,res1)
res2 = re.findall("c\\f","adc\fuouk")
res3 = re.findall("c\\\\l","adc\louwe")  ##['c\x0c'] ['c\\l']
print(res2,res3)

m = re.findall(r"(ad)+","add")   ##['ad']
print(m)
m1 = re.search("(?P<host>\w+)\.(?P<houzui>[a-zA-Z]{3})","baidu.com")
ret=re.search('(?P<id>\d{2})\.(?P<name>\w{3})','23.com')
print(ret,m1)
print(ret.group(),m1.group())
print(ret.group("id"),m1.group("host"))

5、元字符:管道符:“|”

import re
ret = re.findall(r"ka|b","adka|oou")
ret1 = re.findall("ka|bc","soka|bcouwj")
print(ret,ret1)

6、re模块常用函数

import re
###1、findall返回所有满足匹配条件的结果,放在列表里
ret = re.findall(r"ka|b","adka|oou")
ret1 = re.findall("ka|bc","soka|bcouwj")
print(ret,ret1)

###2、search函数会在字符串内查找模式匹配,直到找到第一个匹配然后返回一个匹配信息的对象
###该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None
ret = re.search("a..x","alvxn yuanabcx").group()
print(ret)

###3、通search,只在字符串开始处进行匹配
ret = re.match("abc","abccc").group()
print(ret)

###4、split先按照“a”分割得到''和‘bcd’,在对''和'bcd'分别按''分割
ret = re.split('[ab]','abcd')
print(ret)

###5、sub方法:替换函数
ret = re.sub('\d','abc','alvin6heaton7',1)
ret1 = re.sub('\d','abc','alvin6heaton7',2)  ##alvinabcheaton7 alvinabcheatonabc
ret2 = re.subn('\d','abc','alvin6heaton7')  ##('alvinabcheatonabc', 2)
print(ret,ret1,ret2)

###6、complile编译:编译规则
com = re.compile("\d+")
ret = com.findall("zhangsan212lisi234")
print(ret)   ###['212', '234']

###finditer:查找结果为一个迭代对象
ret = re.finditer("\d+","zhangsan212lisi234")
print(ret)
res = ret.__next__()
print(res.group())

###备注: findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
ret = re.findall("www.(baidu|oldboy).com","www.oldboy.com")
print(ret)     ##['oldboy']
ret1 = re.findall("www.(?:baidu|oldboy).com","www.oldboy.com")
print(ret1)     ##['www.oldboy.com']

 十、logging模块

1、logging日志模块基本格式:

import  logging
logging.debug("debug message")
logging.info("info message")
logging.warning("warning message")
logging.error("error message")
logging.critical("critical message")
###输出:
"""
WARNING:root:warning message
ERROR:root:error message
CRITICAL:root:critical message
""" 

 备注:默认情况下logging模块将日志打印到标准输出中,且只是显示了大于等于warning基本的日志(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET);

2、配置日志输出格式

import  logging
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s %(filename)s [line:%(lineno)d] $(linename)s %(message)s",
    datefmt="%Y-%m-%d %X",
    filename="D:\python project\python_learning\learning\day21/test.log",
    filemode="w"
)

logging.debug("debug message")
logging.info("info message")
logging.warning("warning message")
logging.error("error message")
logging.critical("critical message")
###输出文件格式为:
"""
2019-12-04 11:27:27 logging_test.py [line:11] $(linename)s info message
2019-12-04 11:27:27 logging_test.py [line:12] $(linename)s warning message
2019-12-04 11:27:27 logging_test.py [line:13] $(linename)s error message
2019-12-04 11:27:27 logging_test.py [line:14] $(linename)s critical message
"""
###logging.basicConfig()函数的常用的可用参数说明
"""
filename:用指定的文件名称创建FiledHandler,这样日志会被存储在指定的文件夹
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”,还可指定为"w"
format:指定handler使用的日志显示格式
datefmt:指定日期格式
levle:设置rootlogger的日志显示级别
"""

 

3、logger对象

 

import logging

###常规格式的logger对象格式
logger = logging.getLogger()

##1、创建一个handler用于写入日志文件
fh = logging.FileHandler("D:\python project\python_learning\learning\day21\logger_test.log")

##2、创建一个handler用于输出到控制台
ch = logging.StreamHandler()

##3、日志格式
formatter = logging.Formatter("%(asctime)s-%(name)s-%(levelname)s-%(message)s")

##4、设置日志输出格式
fh.setFormatter(formatter)
ch.setFormatter(formatter)

##5、logger对象添加功能
logger.addHandler(fh)
logger.addHandler(ch)


logger.debug("logger debug message")
logger.info("logger info message")
logger.warning("logger warning message")
logger.error("logger error message")
logger.critical("logger critical message")

logging库提供了多个组件:Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口,Handler发送日志到适当的目的地,Filter提供了过滤日志信息的方法,Formatter指定日志显示格式。

Logger是一个树形层级结构,输出信息之前都要获得一个Logger(如果没有显示的获取则自动创建并使用root Logger)。

 logger = logging.getLogger()返回一个默认的Logger也即root Logger,并应用默认的日志级别、Handler和Formatter设置。
当然也可以通过Logger.setLevel(lel)指定最低的日志级别,可用的日志级别有logging.DEBUG、logging.INFO、logging.WARNING、logging.ERROR、logging.CRITICAL。
      Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical()输出不同级别的日志,只有日志等级大于或等于设置的日志级别的日志才会被输出

 

 

  

 

 

 

  

 

posted @ 2019-12-04 11:54  小菜鸡1枚  阅读(165)  评论(0编辑  收藏  举报