模块

本文讨论Python中模块的概念,全文分为两部分,第一部分介绍自定义模块的导入,第二部分介绍python中常见的内置模块。

一:自定义模块

1.模块的概念

  模块即一个py文件,在实际开发中,一个项目会分为很多的py文件,一个py文件就是一个模块

     模块的好处:

  模块的最大好处就是大大提高了代码的可维护性,其次,编写代码不必从零开始。当一个模块编写完毕,就可以在其他地方引用该模块,另外,使用模块还可以避免函数名和变量名冲突的情形。

  模块一共有三种:

  python标准库

  第三方模块

  自定义模块

2.模块的导入方式:

1 import cal  #导入cal.py
2 from  cal import add    #从cal.py中导入add函数
3 from cal import *   #不推荐使用
4 res=add(4,5)
5 print(res)

上面三种方式都可以导入一个模块,但是建议使用前两种,不要使用最后一种,因为最后一种导入方式代码的可读性非常差。

 将module1中的test模块导入module模块中bin中的方法

二.常见的内置模块:

1.time模块:

 1 import time
 2 
 3 #-----------时间戳
 4 
 5 res=time.time() #返回1970年到现在,已经过去了多少秒钟,这个方法一般用来计算时间
 6 
 7 #-----------结构化时间(时间戳转化为结构化时间)
 8 
 9 res=time.localtime()    #以结构化的方式返回当前时间的年月日时分秒等信息
10 t=time.localtime(122334243)   #可以传入一个参数,用来计算某一秒表示的年月日时分秒信息
11 print(t.tm_year)    #输出结构化时间中的变量,tm_year表示年份
12 
13 #-------------结构化时间,UTC
14 
15 res=time.gmtime(123332)#用法与localtime一致,不过是返回标准时区(英国)的结构化时间
16 
17 
18 #------------将结构化时间转化为时间戳
19 
20 res=time.mktime(time.localtime()) #mktime将结构化时间转为时间戳
21 
22 
23 #------------将结构化时间转化为字符串时间 strftime
24 res=time.strftime('%Y-%m-%d %X',time.localtime())#第一个参数是需要转化为字符串时间的格式,第二个参数是结构化时间
25 
26 #------------将字符串时间转化为结构化时间strptime
27 res=time.strptime('2018:2:2 18:46:34','%Y:%m:%d %X')#第一个参数是·字符串时间,第二个参数是字符串时间的格式
28 
29 #-----------用固定的格式将结构化时间转为字符串时间
30 
31 res=time.ctime()    #将结构化时间转化为固定格式的字符串时间
32 res=time.asctime()#将时间戳转为固定格式的字符串时间
33 
34 #-----------让进程睡眠一段时间
35 time.sleep(1)
36 
37 import datetime
38 
39 res=datetime.datetime.now()#固定格式返回当前时间

2.random模块

 1 import random
 2 
 3 res=random.random() #返回一个0-1之间的浮点型随机数
 4 
 5 res=random.randint(1,3) #返回一个1,3之间的整型随机数(包括3)
 6 
 7 res=random.randrange(1,3) #返回1-3之间的整型随机数(不包括3)
 8 
 9 res=random.choice([12,43,54,543,23443,42])  #从列表中随机选择一个元素
10 
11 res=random.sample([1,2,3,4,5,6,7,8],3)  #从列表中随机返回3个元素,返回结果以列表形式展现
12 
13 res=random.uniform(1,2) #返回1,2之间的一个随机浮点数
14 
15 ret=[1,2,3,4]
16 random.shuffle(ret)     #打乱列表ret中元素的次序
17 
18 #简单的验证码
19 def v_code():
20     ret=''
21     for i in range(5):
22         num=random.randint(0,9)
23         alum=chr(random.randint(65,122))  #chr将序号转为ACSII码中对应的字符
24         s=str(random.choice([num,alum]))
25         ret+=s
26 
27     return ret
28 
29 
30 # print(ord('A')) #ord函数输出ascII编码中的字符的序号
31 print(ord('z'))
32 res=v_code()
33 print(res)

3.os模块

 1 import os
 2 
 3 res=os.getcwd() #获取当前工作目录,即当前python脚本工作的目录(不包含脚本本身)
 4 
 5 #os.chdir('dirname') #改变当前脚本工作目录,相当于shell下的cd命令
 6 
 7 os.curdir          #返回当前目录:('.')
 8 
 9 res=os.pardir      #获取当前目录的父目录字符串名('..')
10 
11 #os.makedirs('dirname1/dirname2') #生成多层递归目录
12 
13 #os.removedirs('dirname1/dirname2')#若目录为空,则删除,并递归到上一级目录,若也为空,则删除,以此类推,直到某一层目录不为空
14 
15 #os.mkdir('dirname1') #生成单及目录,相当于shell中mkdir命令
16 
17 #os.rmdir('dirname')  #删除单及目录,若目录不为空则无法删除,相当于shell中rmdir
18 
19 res=os.listdir('.') #列出指定目录下的所有文件和子目录
20 
21 #os.remove('bin.py')  #删除一个文件,慎用
22 
23 #os.rename('oldname','newname') #重命名文件/目录
24 
25 res=os.stat('dirname') #获取文件/目录信息,返回值中,st_atime代表最近一次查看的时间,st_mtime表示最近修改的时间,st_ctime表示创建的时间
26 
27 res=os.sep  #输出操作系统特定的路肩分隔符,windows下为或者\,linxu下为/
28 
29 res=os.linesep  #输出当前平台使用的行终止符,win下为	
,linux下

30 
31 res=os.pathsep  #输出用于分隔文件路径的字符串,win下wei;,linxu为:
32 
33 res=os.name #输出字符串指示当前使用平台,win->nt,linxu->posix
34 
35 #os.system('bash command') #运行shell命令,直接显示
36 
37 res=os.environ  #获取系统的环境变量
38 
39 #res=os.path.abspath(path) #返回path规范化的绝对路径
40 
41 #res=os.path.split(path)#将path分隔成目录和文件名的二元组返回
42 
43 #os.path.dirname(path) #返回path目录,其实就是os.path.split(path)的第一个元素
44 
45 #os.path.basename(path) #返回path的最后的文件名。如果path以/或结尾,那么就返回空,即os.path.split(path)的第二个元素
46 
47 os.path.exists(path)#如果path存在,返回true,否则返回false
48 
49 os.path.isabs(path) #如果path是绝对路径,返回true
50 
51 os.path.isfile(path)#如果path是一个存在的文件,则返回true
52 
53 os.path.isdir(path) #如果path是一个存在的目录,则返回true
54 
55 a='E:Projectpython'
56 b='day3moduledirname'
57 os.path.join(a,b)#a,b路径拼接起来,结果为E:Projectpythonday3moduledirname
58 
59 os.path.getatime(path) #返回path所指向的文件或目录的最后存取时间
60 
61 os.path.getmtime(path) #返回path所指向的文件或目录的最后修改时间

 4.sys模块

 1 import sys
 2 #com=sys.argv        #命令行参数list,第一个元素是程序本身路径
 3 #com1=com[1]
 4 
 5 #sys.exit(n) #退出程序,正常退出时exit(0)
 6 
 7 #sys.version #获取python解释器程序的版本信息
 8 
 9 #sys.path    #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量中的值
10 
11 #res=sys.platform
12 #print(res)  #返回操作系统平台名称
13 
14 #实现一个简单的进度条
15 import time
16 def jindu(string):
17     for i in range(100):
18         sys.stdout.write(string) #使用标准输出向控制台输出
19         time.sleep(0.1)
20         sys.stdout.flush()#每循环一次就将字符刷新到控制台,否则会等到最后一一起刷出来
21 
22 jindu('#')

5.json

 1 #dic={'name':'hello','age':13}
 2 #需求:需要将该字典的内容按照数据格式存入文件中,然后再按照数据格式从文件中读取出来
 3 #1.按照字典的格式读入文件中,因为文件只能以字符串的格式读取文件,因此需要将字典转为字符串
 4 # str_dic=str(dic)
 5 # with open('test.txt','w',encoding='utf-8') as f:
 6 #     f.write(str_dic)
 7 #
 8 # #2.将文件中的内容读取出来,并转化为字符串的形式
 9 #
10 # with open('test.txt','r',encoding='utf-8') as f:
11 #     data=f.read()   #data读取出来的是一个字符串,需要转化为字典
12 #
13 # data_dic=eval(data) #利用eval提取出字符串中的数据结构
14 
15 
16 #------上面的功能可以使用json模块更简单的实现
17 import json
18 dic={'name':'hello','age':13}
19 dic_json=json.dumps(dic)    #dumps函数会把所有的数据类型保持数据结构,然后整体转为标准字符串格式(双引号格式)
20                             #dic_json={"name":"hello","age":13}这样转之后就能在不同的编程语言之间传输,数据类型是字符串
21 
22 int_json=json.dumps(8)      #int_json=8,字符串类型
23 
24 #with open('new.txt','w',encoding='utf-8') as f:
25 #   f.write(dic_json)      #json.dumps已经直接将字典转为了字符串,可以直接写入文件
26                            #该句等价于 json.dump(dic,f),dump只能用来处理文件
27 
28 
29 with open('new.txt','r',encoding='utf-8') as f:
30     data=json.loads(f.read())   #该句等价于json.load(f) load只能处理文件,解析出文件中数据的数据结构
31 
32 print(type(data))   #数据类型是字典

6.pickle

 1 import pickle       #pickle用法与json完全一致,但是pickle可以解析函数和类,而json只能解析到字典这一层,但是json可以跨语言,pickle只能python使用
 2 
 3 dic={'name':'zhangsan','age':12}
 4 
 5 dic_pickle=pickle.dumps(dic)
 6 
 7 with open('new1.txt','wb') as f:    #注意pickle是将数据转为字节的格式,因此读写文件需要以b模式
 8     f.write(dic_pickle)
 9 
10 with open('new1.txt','rb') as f:
11     data=pickle.loads(f.read())
12 
13 print(data)

7.shelve

 1 import shelve
 2 
 3 f=shelve.open(r'shelve.txt')    #以追加的模式打开,会创建shelve.txt.bak
 4                                 #shelve.txt.bat,shelve.txt.dir三个文件
 5 
 6 f['stu1_info']={'name':'zhangsan','age':19} #以字典的形式向文件中写入数据
 7 f['stu2_info']={'name':'zhangsan1','age':29}
 8 f['stu3_info_info']={'name':'zhangsan3','age':39}
 9 f['stu4_info_info']={'name':'zhangsan5','age':49}
10 f['stu5_info_info']={'name':'zhangsan6','age':59}
11 f['stu6_info_info']={'name':'zhangsan7','age':69}
12 
13 
14 f.close()

8.XML

 1 import xml.etree.ElementTree as ET
 2 
 3 tree=ET.parse("xml_lesson") #解析xml文档树
 4 root=tree.getroot() #获取根节点对象
 5 print(root.tag)  #返回根节点的名字
 6 #
 7 # for i in root:
 8 #     #print(i.tag)    #返回root节点的所有子节点的名字
 9 #     #print(i.attrib) #返回root节点子节点的属性名和属性名称,以字典的形式返回
10 #     for j in i:
11 #         #print(j.tag)    #返回i的子节点的名字
12 #         #print(j.attrib) #返回i的子节点的属性名和属性内容
13 #         #print(j.text)
14 
15 
16 #遍历xml文档
17 
18 # for child in root:
19 #     print(child.tag,child.attrib)
20 #     for i in child:
21 #         print(i.tag,i.attrib,i.text)
22 
23 #只遍历所有的year:
24 # for node in root.iter("year"):
25 #     print(node.tag,node.attrib,node.text)
26 
27 #修改:
28 
29 # for node in root.iter("year"):
30 #     new_year=int(node.text)+1
31 #     node.text=str(new_year)
32 #     node.set("update","yes")
33 #
34 # tree.write('xml_new')
35 
36 #删除:
37 # for country in root.findall("country"):
38 #     rank=int(country.find("rank").text)
39 #     if rank>60:
40 #         root.remove(country)
41 #
42 # tree.write('output.txt')
43 new_xml=ET.Element('namelist')
44 name=ET.SubElement(new_xml,"name",attrib={"enrrold":"yes"})
45 age=ET.SubElement(name,"age",attrib={"age1":"No"})
46 sex=ET.SubElement(name,"sex")
47 sex.text="male"
48 
49 et=ET.ElementTree(new_xml)
50 et.write('new_xml',encoding='utf-8',xml_declaration=True)

9.re

  1 import re
  2 
  3 #-------------元字符: .^$*+?{}[]|()---------------------
  4 #.匹配任意字符,一个.代表一个字符
  5 
  6 res=re.findall("a.c","abcdefbfesafhircarc") #匹配到abc 和arc,
  7 res=re.findall("a..","adbuwebfwaeeddefqaawde")#匹配到adb,aee,aaw
  8 #匹配三个字符,以a开头,后面两个字符是任意字符
  9 
 10 #^匹配在字符串开始
 11 res=re.findall("^a.b","acbdefadbaebatb") #只返回acb
 12 res=re.findall("^a.b","diewadb")        #返回空列表
 13 
 14 #$只在字符串结尾匹配
 15 res=re.findall("a.b$","adbsdjeatacb")#匹配到acb,不会匹配adb
 16 
 17 #* 匹配字符,字符可以在字符串中出现任意次(0~无穷)
 18 res=re.findall("ab*","abbbbbcweferfer") #匹配到abbbbb
 19 res=re.findall("ab*","acdferbxiw")  #匹配到a(b可以出现0次
 20 
 21 #+ 匹配字符,字符在字符串中出现大于0次(1~无穷)
 22 res=re.findall("ab+","abbbbbcweferfer") #匹配到abbbbb
 23 res=re.findall("ab+","acdferbxiw")  #返回空列表,ab要至少出现一次才行
 24 
 25 #?匹配字符,字符在字符串中出现次数不大于1(0-1)
 26 res=re.findall("ab?","abbbbbcweferfera") #匹配到ab,a出现的次数不能超过一次,如果b出现多次,只保留一个
 27 res=re.findall("ab?","acdferbxiw")  #匹配到a(b可以出现0次
 28 
 29 #{}匹配字符,指定字符在字符串中出现的次数
 30 res=re.findall("ab{6}","abbbbbbcewidw")#b出现6次
 31 res=re.findall("ab{1,6}","abdweabbdwedbabbbbbbbbbc")#b出现的次数为1-6次,如果出现的次数超过6次,只保留6个b
 32 
 33 #[]字符集,字符集里面只有三个功能符号- ^ \,其他所有符号都是普通符号(包括前面的元字符)
 34 ######- 表示匹配的范围
 35 res=re.findall("a[a-zA-Z]b","abbdfanieaGbo")#匹配所有以a开头,b结尾,第二个字符是字母的字符串
 36 res=re.findall("a[0-9]b","a9bureba0b")#匹配所有第二个字符为数子
 37 res=re.findall("a[0-9]+b","a990b")#ab中间有多个数字
 38 
 39 ######^表示非,即除去这些字符之外的字符
 40 res=re.findall("a[^0-9]b","adb")#ab之间不能是数字
 41 
 42 #####元字符在字符集中只是普通字符
 43 res=re.findall("a[.]b","a.bvsdadb")#只能匹配到a.b,不会匹配到adb,这里的.就是一个普通字符
 44 
 45 #转义字符
 46 ########d匹配十进制数字
 47 res=re.findall("adb","a2basb")#ab之间是一个数字
 48 res=re.findall("ad+b","a12ba34ba56b")#ab之间是多个数字
 49 
 50 ########D匹配任何非数字字符,相当于类[^0-9]
 51 res=re.findall("aDb","adbadbarba0b")#ab之间不能是数字
 52 
 53 ########w匹配任何的数字和字符,相当于[a-zA-Z0-9]
 54 res=re.findall("aw","a0badb")#ab之间可以是字母或数字
 55 
 56 ########W匹配任何的非数字和字母,相当于[^a-zA-Z0-9]
 57 res=re.findall("aWb","a%ba#b")#ab之间不可以是数字和字母
 58 
 59 ########s匹配任何空白字符,它相当于[	

fv].
 60 res=re.findall("asb","a
ba b afb")#ab之间有空白符的特殊字符或者空格
 61 
 62 ########S匹配任何的非空白字符
 63 res=re.findall("aSb","ababababs")
 64 
 65 #######匹配一个特殊的字符边界,比如空格,#,&等
 66 res=re.findall("I\b","I am aLIst")
 67 res=re.findall(r"I","I am aLIst")  #注意,因为在python中具有特殊的意义,
 68                                      #因此需要使用r表示原生字符(不会被解释器将替换掉,或者使用将转义,
 69 
 70 ########的特殊符号处理
 71 #在python中,有一些是有特殊意义的,比如	,等,如果写正则表达式使用了这些符号,那么python解释器会将这些符号替换成其所代表的特殊意义
 72 #这样,在正则模块中,正则表达式的含义就会发生变化,同时,进入正则·模块后,可能也有一些特殊意义,因此正则表达式可能也会将其替换成她所代表的
 73 #意义,这样一来,正则表达式的含义也会发生变化,因此可能会出现要我们使用进行两次转义操作
 74 
 75 res=re.findall("c\\l","abccle")
 76 ###上面的表达式,本来是想匹配l的,但是因为l是特殊字符,因此需要将l改成\l做一次转义,然后
 77 ###在正则模块中和l也是有特殊含义的,因此还需要对和l也做一次转义操作,这样就有\\四个符号
 78 ###最后匹配结果会是\l
 79 
 80 #|或,两个字符中选择一个
 81 res=re.findall("ab|cd","abdacdaedabcd")#匹配ab或者cd
 82 res=re.findall("a(?:b|c)d","abdacdaedbcds")#匹配abd或者acd
 83 
 84 #()分组
 85 res=re.findall("(abc)+","abcabcabc")#将abc作为整体,出现多次,这种情况下会返回匹配到的括号里面的内容(优先只展示括号内的内容),即只有abc
 86 res=re.findall("(?:abc)+","abcabcabc")#取消掉括号的优先级,这样就会返回abcabcabc
 87 
 88 
 89 #--------------------re模块的常见方法
 90 
 91 #re.findall()#以列表的形式返回匹配到的所有字符
 92 
 93 
 94 #re.search()#只返回匹配到的第一个字符串,即使可以匹配多个,也只是返回第一个
 95 #re.search().group()#注意,search只是返回了一个地址,需要调用group方法才能提取到值
 96 res=re.search("(?P<name>[a-z]+)(?P<age>d+)","alex34nihao45heheh45")#?p<name>表示将匹配到的字符串放入组为name的组中
 97 
 98 #re.match()#功能和search类似,但是只会匹配字符串开始位置。
 99 
100 res=re.split('[ab]','abcd')#先按照a将字符串分割为' '和'bcd',再讲bcd按照b分割成''和cd,因此最后返回的是['','' ,'cd']
101 
102 res=re.sub('d','abc','alvin56yuan68')#第一个参数是匹配规则,第二个参数是用来替代的字符串,第三个参数是原字符串
103                                       #该命名执行结果是将第三个参数中的所有数字替换成abc

10.logging模块

 1 import logging
 2 
 3 #-----------------------------------logging.basicConfig
 4 # logging.basicConfig(
 5 #     level=logging.DEBUG,
 6 #     filename="logger.log",
 7 #     filemode="w",
 8 #     format="%(asctime)s %(filename)s[%(lineno)d]  %(message)s"
 9 #
10 #
11 # )
12 #
13 # logging.debug('hello')
14 # logging.info('hello')
15 # logging.warning('warning message')
16 # logging.error('error message')
17 # logging.critical('critical message')
18 
19 #-----------------------------------logger
20 # def logger():
21 #     logger=logging.getLogger()
22 #
23 #
24 #     fh=logging.FileHandler("test_log")
25 #     #ch=logging.StreamHandler()
26 #
27 #     fm=logging.Formatter("%(asctime)s  %(message)s")
28 #
29 #     fh.setFormatter(fm)
30 #     #ch.setFormatter(fm)
31 #
32 #     logger.addHandler(fh)
33 #     #logger.addHandler(ch)
34 #     logger.setLevel("DEBUG")
35 #
36 #     return logger
37 # #----------------------
38 # logger=logger()
39 #
40 # logger.debug("debug")
41 # logger.info("info")
42 # logger.warning("warning")
43 # logger.error("error")
44 # logger.critical("critical")
45 #--------------------------------------------------
46 import logging
47 
48 logger=logging.getLogger()
49 
50 
51 logger1 = logging.getLogger('mylogger')
52 logger1.setLevel(logging.DEBUG)
53 
54 # logger2 = logging.getLogger('mylogger')
55 # logger2.setLevel(logging.WARNING)
56 
57 
58 fh=logging.FileHandler("test_log-new")
59 ch=logging.StreamHandler()
60 
61 # logger.addHandler(ch)
62 # logger.addHandler(fh)
63 
64 logger1.addHandler(fh)
65 logger1.addHandler(ch)
66 
67 # logger2.addHandler(fh)
68 # logger2.addHandler(ch)
69 
70 
71 # logger.debug('logger debug message')
72 # logger.info('logger info message')
73 # logger.warning('logger warning message')
74 # logger.error('logger error message')
75 # logger.critical('logger critical message')
76 
77 # logger1.debug('logger1 debug message')
78 # logger1.info('logger1 info message')
79 # logger1.warning('logger1 warning message')
80 # logger1.error('logger1 error message')
81 # logger1.critical('logger1 critical message')
82 
83 # logger2.debug('logger2 debug message')
84 # logger2.info('logger2 info message')
85 # logger2.warning('logger2 warning message')
86 # logger2.error('logger2 error message')
87 # logger2.critical('logger2 critical message')

11.configparse模块:

 1 import configparser
 2 
 3 # config=configparser.ConfigParser()  #config={}
 4 #
 5 # config["DEFAULT"]={"Severlink":'45',
 6 #                     "Compreesion":'yes',
 7 #                     "CompreesionLevel":'9'
 8 #                    }
 9 #
10 # config['bitbucket.org']={}
11 #
12 # config['bitbucket.org']['User']='hg'
13 #
14 # config['topsercet.com']={}
15 #
16 # topsercet=config['topsercet.com']
17 # topsercet['Hot pred']='50022'
18 # topsercet['niha']='xoex'
19 #
20 # with open('test.txt','w',encoding='utf-8') as f:
21 #     config.write(f)
22 
23 #----------------------增删改查-----------------
24 #config文件当做字典处理即可
25 config=configparser.ConfigParser()
26 print(config.sections())  #[]
27 config.read('test.txt')
28 print(config.sections())    #读取配置文件中的key值,不读取DEFAULT以列表的形式返回
29 ''
30 print('a' in config)
31 print('bitbucket.org' in config)  #判断某个key值是否在配置文件中
32 print(config['bitbucket.org']["User"]) #hg
33 
34 #遍历配置文件
35 for key in config:
36     print(key)
37 
38 for key in config['bitbucket.org']:
39     print(key)
40 
41 
42 res=config.options('bitbucket.org')#返回bitbucket和DEFAULT的所有key值
43 res=config.items('bitbucket.org')#以键值对的方式返回bitbucket和DEFAULT的所有值
44 res=config.get('bitbucket.org','compreesion')#yes,判断key值是否在某一个字典中
45 
46 
47 config.add_section('yuan') #赠加一个section模块,即key值
48 config.set('yuan','key1','1111')  #增加一个setion到一个新文件中
49 
50 config.write(open('new.txt','w'))#将增加的内容和原来的内容一起写入新文件中
51 
52 config.remove_section('yuan')   #删除一个setion
53 config.remove_option('bitbucket.org','User')    #删除一个option
54 config.write(open('new1_txt','w'))
55 print('------',res)

12.hashlib

1 import hashlib
2 
3 obj=hashlib.md5()
4 obj.update('hello'.encode('utf-8'))  #将hello按照utf-8编码方式加密,单向
5 res=obj.hexdigest()#生成密文
6 print(res)
原文地址:https://www.cnblogs.com/jiachuantang/p/8406238.html