python开发 【第四篇】模块
一 模块的作用:提高代码的可维护性
二 模块分为:
1 python标准库
2 第三方模块
3 应用程序自定义模块
三 impor的作用t:
1 执行对应文件
2 引入变量名
被执行文件的路径要和执行文件路径相同
标红是因为pycharm无法识别,不是输入错误
cal.py要与bin.py路径相同才可以用import调用
import os,sys EASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #将bin.py的路径改为web print(EASE_DIR) sys.path.append(EASE_DIR) from web1.web2 import cal print(cal.add(3,7)) G:\untitled\python\web 10
四 __name__=='__main__'
用于调试
调用模块时__name__!='__main__',其下面的程序不会运行
五 时间模块time
时间戳 :1970/1/1距离现在的秒数
time.time()
import time print(time.time()) print(time.localtime()) print(time.gmtime()) print(time.mktime(time.localtime())) print(time.strftime('%Y-%m-%d-%X',time.localtime())) print(time.strptime('2017:01:01:16:52:00','%Y:%m:%d:%X')) #asctime和ctime不用自己定义参数 print(time.asctime()) print(time.ctime()) import datetime print(datetime.datetime.now()) 1534935829.1602685 time.struct_time(tm_year=2018, tm_mon=8, tm_mday=22, tm_hour=19, tm_min=3, tm_sec=49, tm_wday=2, tm_yday=234, tm_isdst=0) time.struct_time(tm_year=2018, tm_mon=8, tm_mday=22, tm_hour=11, tm_min=3, tm_sec=49, tm_wday=2, tm_yday=234, tm_isdst=0) 1534935829.0 2018-08-22-19:03:49 time.struct_time(tm_year=2017, tm_mon=1, tm_mday=1, tm_hour=16, tm_min=52, tm_sec=0, tm_wday=6, tm_yday=1, tm_isdst=-1) Wed Aug 22 19:03:49 2018 #结构化时间转变为固定字符串形式 Wed Aug 22 19:03:49 2018 #时间戳转变为固定字符串形式 2018-08-22 19:03:49.193250
六 random模块 #随机取值
import random print(random.random()) #(0,1)之间的一个浮点数 print(random.randint(1,3)) # 取1,2,3中的一个 print(random.randrange(1,3)) #取1,2中的一个 print(random.sample([1,2,3],2))#取1,2,3中的两个 print(random.choice([1,2,3])) #取1,2,3中的一个 print(random.uniform(1,3)) #取(1,3)之间的一个浮点数 a=[1,2,4,5] random.shuffle(a) #将a中数字随机排列 print(a) 0.7347057697582601 1 2 [2, 3] 1 2.273764153373582 [2, 1, 5, 4]
import random #随机产生五个由数字字母组成字符串 def a(): v='' for i in range(5): b=random.randint(0,9) c=chr(random.randint(65,122)) s=str(random.choice([b,c])) v+=s return v print(a()) 0i02j
七 os模块
import os print(os.getcwd()) #获取当前工作目录 os.chdir('..') #修改目录 ..返回上一级 print(os.getcwd()) os.makedirs('dirname1/dirname2') #生成递归目录 os.removedirs('dirname1/dirname2') #目录若为空删除并返回上一层,上一层若为空删除 os.mkdir('') #生成单级目录 os.rmdir('') #删除单级目录若不为空无法删除报错 print(os.listdir(''))#列出指定目录下所有的文件目录隐藏文件以列表方式打印 os.remove('') #删除一个文件 os.rename('','') #重命名 print(os.stat('')) #获取文件目录信息 print(os.sep) #输出操作系统特定分隔符 win '\' linux '/' print(os.pathsep) #输出分割文件路径的字符串 win ; Linux : print(os.system('dir')) #运行shell命令直接显示 print(os.path.split(r'G:\untitled\python\os_\os-1.py')) #将path分割成目录文件名返回 print(os.path.basename(r'G:\untitled\python\os_\os-1.py')) #返回path最后的文件名 print(os.path.exists(r'G:\untitled\python\os_\os-1.py')) #path路径存在返回True 不存在返回Flase a='python\os_' b='os-1.py' print(os.path.join(a,b)) #ab拼接 print(os.path.getatime(''))#最后访问时间 print(os.path.getmtime(''))#最后修改时间 print(os.environ) #获得系统环境变量 print(os.path.abspath('os-1.py')) #获取path的绝
八 sys模块
import sys,time print(sys.platform) #返回操作系统平台名称 print(sys.version)#返回python解释器程序版本信息 print(sys.argv)#命令行参数list,第一个元素是程序本身路径 和input('>>>')功能一样 command=sys.argv[1] path=sys.argv[2] if command=='post': pass if command=='get': pass print(sys.path)#返回模块路径 sys.stdout.write('#') sys.stdout.write('#') #打印,所有内容打印完一起显示 for i in range(0,10): sys.stdout.write('#') sys.stdout.flush() #刷新 打印一次显示一次 time.sleep(1)
九 pickle模块
import pickle a={'a':2} j=pickle.dumps(a) print(type(j)) #<class 'bytes'> f=open('pickle','wb') f.write(j)#----------等价于pickle.dump(a,f) r=open('pickle','rb') data=pickle.loads(r.read()) #----等价于pickle.load(f) print(data)
十 shelve 模块
import shelve f=shelve.open(r'shelve') f['stul_info']={'name':'alex','age':'18'} #生成三组文件 f.close()
print(f.get('stul_info')['age'])
十一 json模块 #可用于任何语言之间的数据交换
import json dic={'name':'alex'} f_write=open("hello","w") data=json.dumps(dic)#data=json.dump(dic,f_write) f_write.write(data) f_read=open("hello","r") data=json.loads(f_read.read())# data=json.load(f_read) print(data)
十二 logging模块 #日主模块
import logging logging.basicConfig(filename='logger.log',level=logging.DEBUG, format='%(asctime)s,[%(lineno)d],%(message)s,' '%(filename)s',filemode='w') #filename打印到文件中 #debug,info,warning,error,critical为日志等级 logging.debug('hello') logging.info ('hello') logging.warning('hello') logging.error('hello') logging.critical('hello')
import logging def logger(): logger=logging.getLogger() t=logging.FileHandler('logger.txt') #向文件发送 w=logging.StreamHandler() #向屏幕发送 logger.addHandler(t) logger.addHandler(w) f=logging.Formatter('%(asctime)s,%(message)s') t.setFormatter(f) w.setFormatter(f) return logger logger=logger() logging.debug('hello') logging.info ('hello') logging.warning('hello') logging.error('hello') logging.critical('hello')
十三 hashlib模块
import hashlib obj = hashlib.md5() # md5不能反解 obj=hashlib.md5("sdcs".encode('utf8'))#加严 obj.update("hello".encode('utf8')) print(obj.hexdigest())
十四 configparser模块 #文件的存删改查
import configparser config=configparser.ConfigParser() config["DEFAULT"]={'ServerAliveInterval':'45'} config['bitbucket.org']={} config['bitbucket.org']['User']='fg' config['topsecret.server.com']={} topsecret=config['topsecret.server.com'] topsecret['Host Port']='501' topsecret['For']='no' with open('example.ini','w') as f: config.write(f) config.read('example.ini') print(config.sections()) for key in config['bitbucket.org']: print(key) print(config.options('bitbucket.org')) print(config.items('bitbucket.org')) print(config.get('bitbucket.org','serveraliveinterval')) config.add_section('fg') config.set('fg','gj','j') config.remove_section('bitbucket.org') config.remove_option('topsecret.server.com','for') config.write(open('i.cfg',"w"))
十五re模块 #正则
普通字符:数字字母大部分特殊符号
元字符:. * \ () $ ^ ? [] {} + |
#findall匹配全部
print(re.findall("a.*","a\';.@#$%^&\n")) #. 可以匹配除换行符外的所有字符 ["a';.@#$%^&"] print(re.findall("a.*?","asd")) # *前面的字符重复0到无穷 ?前面的字符重复0到1次 ['a'] print(re.findall("a.+?","asd")) #+前面的字符重复1到无穷次 ['as'] print(re.findall("a.{3}","asdfcx")) #{} 匹配指定次数 ['asdf'] print(re.findall("a[dfg]","adhfag")) #[] 选出一个 ['ad', 'ag'] print(re.findall("a|g","adhfag")) #| 或 ['a', 'a', 'g'] print(re.findall("www.(baidu|163).com","www.baidu.com") #优先显示() ['baidu'] print(re.findall("www.(?:baidu|163).com","www.baidu.com")) # ?:去除优先集 ['www.baidu.com'] print(re.findall("^a","abafa")) #^a匹配开头是a的 ['a'] print(re.findall("a$","dacda")) #a$匹配结尾是a的 ['a']
#大小写匹配的内容相反 print(re.findall("\d+","fg12hg42")) #\d匹配所有十进制数 print(re.findall("\D","fg12'.?")) print(re.findall("\s.+","a sd")) #\s 匹配空格 print(re.findall("\S"," ;l.>$3#")) print(re.findall("\w","fg12\n'")) #\w 匹配所有字母数字 print(re.findall("\W","fg12\n'")) print(re.findall(r"a\b","a#asd")) #\b 匹配特殊字符空格 print(re.findall(r"d\\h","dfd\h"))#\ 可以将有意义的字符转为无意义将无意义的字符转为有意义 ['12', '42'] ['f', 'g', "'", '.', '?'] [' sd'] [';', 'l', '.', '>', '$', '3', '#'] ['f', 'g', '1', '2'] ['\n', "'"] [] ['d\\h'}
print(re.search("s","ascsa")) #search匹配第一个返回一个对象
print(re.search("s","ascsa").group()) #从对象中取出用group()
print(re.match("a","asa")) #match匹配开头第一个返回一个对象,相当于^search
print(re.split("a","dfassadfa")) #split分割
print(re.sub("\d","A","14fgs48h",2))#sub替换可设置替换数量
print(re.subn("\d","A","14fgs48h",2)) #返回一个元组显示替换结果和替换数量
a=re.finditer("\d","a47s56csa") #finfiter 将返回值封装到迭代器
print(next(a).group())
print(next(a).group())
b=re.search("(?P<name>[a-z]+(?P<age>\d+))","as45cf47jh18").group('age') #?P<name> 分组
print(b)
<re.Match object; span=(1, 2), match='s'>
s
<re.Match object; span=(0, 1), match='a'>
['df', 'ss', 'df', '']
AAfgs48h
('AAfgs48h', 2)
4
7
45