Python模块之常用模块,反射以及正则表达式
常用模块
1. 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所指向的文件或者目录的最后修改时间
2. sys
用于提供对Python解释器相关的操作:
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdin, sys.stdout, sys.stderr stdin , stdout , 以及stderr 变量包含与标准I/O 流对应的流对象. 当需要更好地控制输出,而print 不能满足你的要求, 它们就是你所需要的.
sys.stdout.write('please:')
val = sys.stdin.readline()[:-1]
sys.modulessys.modules
是一个全局字典,该字典是python启动后就加载在内存中。每当程序员导入新的模块,sys.modules
将自动记录该模块。
当第二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度。它拥有字典所拥有的一切方法。
#1.sys.argv用法 import sys
print (sys.argv[0])
print (sys.argv[1]) 运行: # python sys.py argv1
>>>sys.py
>>>argv1 #2.sys.exit用法
import sys
print "hello"
try:
sys.exit(1)
except (SystemExit): # 捕获退出的异常
pass # 捕获后不做任何操作
print "there" 运行:
>>>hello
>>>there 3.sys.path 用法
>>> import sys
>>> sys.path
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', ...] >>>sys.path.append("自定义模块路径") #加入自定义模块路径
import sys
import time
def view_bar(num,total):
rate = float(num) / float(total)
rate_num = int(rate * 100)
r = '\r%d%%'%(rate_num)
sys.stdout.write(r)
sys.stdout.flush() if __name__ == '__main__':
for i in (range(0,101)):
time.sleep(0.1)
view_bar(i,100)
进度条示例
3. random
随机数
import random
print(random.random()) #用于生成一个0到1的随机符点数: 0 <= n < 1.0
print(random.randint(1,5)) #获取一个从1到5的整数
print(random.randrange(1,10,2)) #获取一个从1到10步长为4的随机数 #从列表a从随机取出一个元素
a=[1,2,3,4,5]
random.choice(a) #打乱列表a里元素的顺序(洗牌)
a=[1,2,3,4,5]
random.shuffle(a) #从列表a中以随机顺序取出3个元素(一个元素只能取出一次,所以取出的个数不能大于列表所含元素的个数)
a=[1,2,3,4,5]
random.sample(a,3)
import random checkcode = ''
for i in range(4):
current = random.randrange(0,4)
if current !=i:
temp = chr(random.randrange(65,90))
else:
temp = random.randrange(0,9)
checkcode += str(temp) print(checkcode)
随机验证码
4. datetime&time
时间相关的操作,时间有三种表示方式:
时间戳 1970年1月1日之后的秒,即:time.time()
格式化的字符串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
结构化时间 元组包含了:年、日、星期等... time.struct_time 即:time.localtime()
import time #时间戳
print(time.time()) #返回1970年1月1日之后到现在的秒
>>>1480153101.8116162 #结构化
print(time.localtime()) #返回本地时间 的struct time对象格式
print(time.gmtime()) #返回UTC 时区 的struct time对象格式 >>>time.struct_time(tm_year=2016, tm_mon=11, tm_mday=26, tm_hour=17, tm_min=38, tm_sec=21, tm_wday=5, tm_yday=331, tm_isdst=0)
>>>time.struct_time(tm_year=2016, tm_mon=11, tm_mday=26, tm_hour=9, tm_min=38, tm_sec=21, tm_wday=5, tm_yday=331, tm_isdst=0) #格式化的字符串
print(time.ctime())
print(time.asctime()) >>>Sat Nov 26 17:38:21 2016
>>>Sat Nov 26 17:38:21 2016 #相互转换
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())) # 将结构化时间对象转换成你想要的格式化的字符串(常用)
print(time.strptime('2016-11-11 15:06', '%Y-%m-%d %H:%M')) ## 将格式化的字符串时间转换成结构化的struct对象(更常用)
print(time.mktime(time.localtime())) #将struct时间对象转成时间戳
print(time.mktime(time.strptime(time.ctime()))) #将格式化的字符串转换成时间戳
print(time.asctime(time.gmtime())) #将struct时间对象转成格式化的字符串
print(time.ctime(time.time()-86400)) #将时间戳转换成格式化的字符串 >>>2016-11-26 17:43:32
>>>time.struct_time(tm_year=2016, tm_mon=11, tm_mday=11, tm_hour=15, tm_min=6, tm_sec=0, tm_wday=4, tm_yday=316, tm_isdst=-1)
>>>1480153412.0
>>>1480153412.0
>>>Sat Nov 26 09:43:32 2016
>>>Fri Nov 25 17:43:32 2016 import datetime print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925
print(datetime.date.fromtimestamp(time.time())) # 时间戳直接转成日期格式 2016-08-19
print(datetime.datetime.now()) #显示当前时间(常用)
print(datetime.datetime.now() + datetime.timedelta(3)) #当前时间+3天
print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天
print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时
print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分 >>>2016-11-26 17:43:32.231371
>>>2016-11-26
>>>2016-11-26 17:43:32.231371
>>>2016-11-29 17:43:32.231371
>>>2016-11-23 17:43:32.231371
>>>2016-11-26 20:43:32.231371
>>>2016-11-26 18:13:32.231371 #时间替换
c_time = datetime.datetime.now()
print(c_time.replace(minute=3,hour=2))
print(c_time.replace(2015,11,26)) >>>2016-11-26 02:03:32.231371
>>>2015-11-26 17:43:32.231371 #时间比较
print(type(time.localtime()))
print(type(c_time))
print(c_time>c_time.replace(2015,11,26)) >>> <class 'time.struct_time'>
>>> <class 'datetime.datetime'>
>>>True
5. logging模块
用于便捷记录日志且线程安全的模块
import logging #将日志信息写入到文件
logging.basicConfig(filename='example.log',level=10,
format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') logging.debug('Action')
logging.info('teacher cang is action starting')
logging.warning('User [derby] attempted wrong password more then three times')
logging.error('The show is not in time')
logging.critical('server is down')
日志级别
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
日志格式
%(name)s |
Logger的名字 |
%(levelno)s |
数字形式的日志级别 |
%(levelname)s |
文本形式的日志级别 |
%(pathname)s |
调用日志输出函数的模块的完整路径名,可能没有 |
%(filename)s |
调用日志输出函数的模块的文件名 |
%(module)s |
调用日志输出函数的模块名 |
%(funcName)s |
调用日志输出函数的函数名 |
%(lineno)d |
调用日志输出函数的语句所在的代码行 |
%(created)f |
当前时间,用UNIX标准的表示时间的浮 点数表示 |
%(relativeCreated)d |
输出日志信息时的,自Logger创建以 来的毫秒数 |
%(asctime)s |
字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 |
%(thread)d |
线程ID。可能没有 |
%(threadName)s |
线程名。可能没有 |
%(process)d |
进程ID。可能没有 |
%(message)s |
用户输出的消息 |
怎么同时把log打印在屏幕和文件日志里?
Python 使用logging模块记录日志涉及四个主要类,使用官方文档中的概括最为合适:
- logger提供了应用程序可以直接使用的接口;
- handler将(logger创建的)日志记录发送到合适的目的输出;
- filter提供了细度设备来决定输出哪条日志记录;
- formatter决定日志记录的最终输出格式。
logger
每个程序在输出信息之前都要获得一个Logger。Logger通常对应了程序的模块名,比如聊天工具的图形界面模块可以这样获得它的Logger:
LOG=logging.getLogger(”chat.gui”)
而核心模块可以这样:
LOG=logging.getLogger(”chat.kernel”)
Logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高
Logger.addFilter(filt)、Logger.removeFilter(filt):添加或删除指定的filter
Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增加或删除指定的handler
Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():可以设置的日志级别
handler
handler对象负责发送相关的信息到指定目的地。Python的日志系统有多种Handler可以使用。有些Handler可以把信息输出到控制台,有些Logger可以把信息输出到文件,还有些 Handler可以把信息发送到网络上。如果觉得不够用,还可以编写自己的Handler。可以通过addHandler()方法添加多个多handler
Handler.setLevel(lel):指定被处理的信息级别,低于lel级别的信息将被忽略
Handler.setFormatter():给这个handler选择一个格式
Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象
每个Logger可以附加多个Handler。接下来我们就来介绍一些常用的Handler:
1) logging.StreamHandler
使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。它的构造函数是:
StreamHandler([strm])
其中strm参数是一个文件对象。默认是sys.stderr
2) logging.FileHandler
和StreamHandler类似,用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件。它的构造函数是:
FileHandler(filename[,mode])
filename是文件名,必须指定一个文件名。
mode是文件的打开方式。参见Python内置函数open()的用法。默认是’a',即添加到文件末尾。
3) logging.handlers.RotatingFileHandler
这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler自动把 文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建 chat.log,继续输出日志信息。它的构造函数是:
RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
其中filename和mode两个参数和FileHandler一样。
maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。
backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。
4) logging.handlers.TimedRotatingFileHandler
这个Handler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就 自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。它的构造函数是:
TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义。
interval是时间间隔。
when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:
S 秒
M 分
H 小时
D 天
W 每星期(interval==0时代表星期一)
midnight 每天凌晨
分别将日志打印到屏幕,和文件的示例
注意:全局日志级别 设置的目的为只显示比它高的级别,低级别的不会显示
import logging #create logger
logger = logging.getLogger('Test-Log') #get the logger object first
logger.setLevel(logging.INFO) # set a global log level #create console handler and set level to debug
ch =logging.StreamHandler() #print the log on monitor
ch.setLevel(logging.DEBUG) #create file handler and set level to Info fh = logging.FileHandler('ProgramInfo.log')
fh.setLevel(logging.WARNING) # Format the log fm = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s')
fm1 = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') # add formatter to ch and fh ch.setFormatter(fm1)
fh.setFormatter(fm) # add ch and fh to logger
logger.addHandler(ch)
logger.addHandler(fh)
# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
6.hashlib
用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
import hashlib # ######## md5 ########
hash = hashlib.md5()
# help(hash.update)
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())
print(hash.digest()) ######## sha1 ######## hash = hashlib.sha1()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest()) #因为MD5是不可逆的加密方式,因此通过过撞库可以反解。
#所以,有必要对加密算法中添加自定义key再来做加密。 # ######## md5+key ######## hash = hashlib.md5(bytes('898oaFs09f',encoding="utf-8"))
hash.update(bytes('admin',encoding="utf-8"))
print(hash.hexdigest())
更牛逼的加密方式:python内置还有一个 hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密
import hmac h = hmac.new(bytes('898oaFs09f',encoding="utf-8"))
h.update(bytes('admin',encoding="utf-8"))
print(h.hexdigest())
7. 正则表达式 re模块
python中re模块提供了正则表达式相关操作
'.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
>>>print(re.findall('d.ng','lsddengllsding'))
>>>['deng', 'ding'] '^' 匹配字符开头,若指定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
Python反射
当我们需要根据用户的输入来访问某个模块里对应的函数时,通常的体位是这样的
# lib库里的common 模块 def login():
print('炫酷的登陆页面') def logout():
print('炫酷的退出页面') def home():
print('炫酷的主页面') # main 程序运行 from lib import common def run():
inp = input('请输入URL:')
if inp == 'login':
common.login() elif inp == 'logout':
common.logout() elif inp == 'home':
common.home() else :
print('404') if __name__ == '__main__':
run()
当common 里有一千个函数怎么办? 简单粗暴的写一千个吗? no,,no... 太low,什么年代了,还男上女下~
duang···duang~ duang; Python提供了省时省力的新姿势,反射
即:利用字符串的形式去对象(模块)中去操作(寻找\检测\删除\设置)成员,其主要是使用内置(getattr)函数去对象中寻找相应的函数,将上面改成发射的形式如下:
from lib import common def run():
inp = input('请输入URL:') if hasattr(common,inp): # 检测相应的模块是否存在 func = getattr(common,inp) # 获取相应的函数
func()
else:
print('404') if __name__ == '__main__':
run()
以上只是在一个模块里找,通常我们的程序会使用到多个模块里的不同的函数,就像男人不会在找一个女朋友,那么有咩多p的方法?
其实Python里想要3,4,5,6p 很简单,利用字符串的方式导入模块就可以了,可以用字符串的方式导入,那么就可以使用变量导入模块了
Python是怎么轻轻松松3,4,5P的呢? 利用双下滑线导入( __import__):
# 当前目录下的lib 文件夹里的文件
# lib
##account.py
##common.py
##order.py
import sys,os f=os.getcwd()+'\lib'
sys.path.append(f) def run():
inp = input('请输入URL:')
m,f = inp.split('/') # 默认输入规定 "模块/函数" 如:common/login
obj = __import__(m) #不导入路径的方式
#obj = __import__('lib.'+m,fromlist=True) #如果没有后面的参数__import__ 默认只会导入到lib,后面的不会导入 if hasattr(obj,f): # 检测相应的模块是否存在 func = getattr(obj,f) # 获取相应的函数
func()
else:
print('404') if __name__ == '__main__':
run()
Python模块之常用模块,反射以及正则表达式的更多相关文章
- python笔记之常用模块用法分析
python笔记之常用模块用法分析 内置模块(不用import就可以直接使用) 常用内置函数 help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像 ...
- python基础31[常用模块介绍]
python基础31[常用模块介绍] python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的li ...
- 十八. Python基础(18)常用模块
十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...
- Python 五个常用模块资料 os sys time re built-in
1.os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果. os.name:返回当前操作系统名称('posix', 'nt', ' ...
- python函数和常用模块(三),Day5
递归 反射 os模块 sys模块 hashlib加密模块 正则表达式 反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数 ...
- Python基础之--常用模块
Python 模块 为了实现对程序特定功能的调用和存储,人们将代码封装起来,可以供其他程序调用,可以称之为模块. 如:os 是系统相关的模块:file是文件操作相关的模块:sys是访问python解释 ...
- Python自动化之常用模块
1 time和datetime模块 #_*_coding:utf-8_*_ __author__ = 'Alex Li' import time # print(time.clock()) #返回处理 ...
- Python学习笔记-常用模块
1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...
- Day5 - Python基础5 常用模块学习
Python 之路 Day5 - 常用模块学习 本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shel ...
随机推荐
- selenium webdriver 建行软键盘输入密码
driver.get("https://ibsbjstar.ccb.com.cn/app/V5/CN/STY1/login.jsp"); driver.manage().timeo ...
- vuex 使用笔记
1. 在store.js中 储存数据状态 02. 在action.js中分发行为 03. 在页面中获取并使用状态
- 转行进入IT前端,目标全栈
选择进入IT这个行业,未来充满着挑战,未来充满着机遇,互联网已经走入高速稳定的发展正轨了,前端大时代也已经到来了.前端之路怎么走,前端需要不停地学习新知识,跟紧时代的步伐,成为全栈工程师是前端的目标. ...
- 二维码跳转不同的 app store
说道二维码 之前是用来跳转app store 然后在就是出来的 扫码付款什么的 用的很平常,其实里面也很简单 自己刚开始接触的时候 同事说要做一个二维码下载 应用 => 我=懵逼 ...
- JS中定义对象原型的两种使用方法
第一种: function Person() { this.username = new Array(); this.password = "123"; } Person.prot ...
- 利用yeoman快速搭建React+webpack+es6脚手架
自从前后端开始分离之后,前端项目工程化也显得越来越重要了,之前写过一篇搭建基于Angular+Requirejs+Grunt的前端项目教程,有兴趣的可以点这里去看 但是有些项目可以使用这种方式,但有些 ...
- AOP详解
什么是AOP AOP Aspect Oriented Programing 面向切面编程 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视.事务管理.安全检查.缓存) Spring ...
- UVALive 2453 Wall (凸包)
题意:给你一个多边形的城堡(多个点),使用最短周长的城墙将这个城堡围起来并保证城墙的每个点到城堡上的每个点的距离都不小于l 题解:因为两点间的直线一定比折线短,所以这样做 先使用所有点求得一个凸包,接 ...
- Qt中 QString 和int, char等的“相互”转换
转载:http://blog.csdn.net/ei__nino/article/details/7297791 Qt中 int ,float ,double转换为QString 有两种方法 1.使用 ...
- WebGL入门教程(三)-webgl动画
前面文章: WebGL入门教程(一)-初识webgl WebGL入门教程(二)-webgl绘制三角形 WebGL动画有移动.旋转和缩放,我们将移动.旋转和缩放图形,然后将其绘制到屏幕上,称为变换(tr ...