Python常用模块
? time模块时间表示形式: 在Python中,通常有这三种方式来表示时间: 1.??时间戳(timestamp) : 通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。 2.? 元组(struct_time) ? :??struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等) 3.??格式化的时间字符串 :??‘1988-03-16’ # <1> 时间戳 >>> import time >>> time.time() #--------------返回当前时间的时间戳 # <2> 时间字符串 >>> time.strftime("%Y-%m-%d %X") # <3> 时间元组 >>> time.localtime() time.struct_time(tm_year=2017,tm_mon=4,tm_mday=26,tm_hour=0,tm_min=32,tm_sec=42,tm_wday=2,tm_yday=116,tm_isdst=0) 小结:时间戳是计算机能够识别的时间;时间字符串是人能够看懂的时间;元组则是用来操作时间的 几种时间形式的转换:
? ?random模块? random.random() ?# 大于0且小于1之间的小数 random.randint(1,5) ? # 大于等于1且小于等于5之间的整数 random.uniform(1,3) #大于1小于3的小数 ? random.randrange(1,3) ? ??# 大于等于1且小于3之间的整数 ? random.choice([1,‘23‘,[4,5]]) #1或者23或者[4,5] ? random.sample([1,5]],2) #列表元素任意2个组合 ? random.shuffle([1,3,5,7,9]) #打乱排序? import random def v_code(): code = ‘‘ for i in range(5): num=random.randint(0,9) alf=chr(random.randint(65,90)) add=random.choice([num,alf]) code="".join([code,str(add)]) return code print(v_code()) ? ? hashlib模块? Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。 摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。 摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。 摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。 MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。 import hashlib md5 = hashlib.md5() md5.update(‘how to use md5 in python hashlib?‘) print md5.hexdigest() ## 计算结果如下: d26a53750bc40b38b65a520292f69306 ? ? 如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的: md5 = hashlib.md5() md5.update(‘how to use md5 in ‘) md5.update(‘python hashlib?‘) print md5.hexdigest() ? ? SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。 import hashlib sha1 = hashlib.sha1() sha1.update(‘how to use sha1 in ‘) sha1.update(‘python hashlib?‘) print sha1.hexdigest() ? ? 摘要算法应用: 任何允许用户登录的网站都会存储用户登录的用户名和口令。它们将用户名和口令存储在数据库表中。 ? ? ?如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。 正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要。 ? 在程序设计上对简单口令加强保护: 由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”: hashlib.md5("salt".encode("utf8")) ? 经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。 ? 让使用相同口令的用户存储不同的MD5: 如果假定用户无法修改登录名,就可以通过把登录名作为Salt的一部分来计算MD5,从而实现相同口令的用户也存储不同的MD5。 摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改。 但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。 ? 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下为"tn",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所指向的文件或者目录的最后修改时间 os.path.getsize(path) ??返回path的大小 注意: os.stat(‘path/filename‘) 获取文件/目录信息 st_mode: inode 保护模式 st_ino: inode 节点号。 st_dev: inode 驻留的设备。 st_nlink: inode 的链接数。 st_uid: 所有者的用户ID。 st_gid: 所有者的组ID。 st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。 st_atime: 上次访问的时间。 st_mtime: 最后一次修改的时间。 st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。 ? ? sys模块?sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称 ? ? re模块就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。 正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。 字符匹配(普通字符,元字符): 普通字符: 大多数字符和字母都会和自身匹配 元字符:( .? ^? $? *? +? ?? { }? [ ]? |? ( )? ) 转义符 : 1、反斜杠后边跟元字符去除特殊功能, 2、反斜杠后边跟普通字符实现特殊功能, d 匹配任何十进制数; 它相当于类 [0-9]。 D 匹配任何非数字字符; 它相当于类 [^0-9]。 s 匹配任何空白字符; 它相当于类 [ tnrfv]。 S 匹配任何非空白字符; 它相当于类 [^ tnrfv]。 w 匹配任何字母数字字符; 它相当于类 [a-zA-Z0-9_]。 W 匹配任何非字母数字字符; 它相当于类 [^a-zA-Z0-9_] b 匹配一个特殊字符边界,比如空格 ,&,#等 ? 分组 () 元字符之| 字符集[] 贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配 非贪婪匹配:在满足匹配时,匹配尽可能短的字符串,使用?来表示非贪婪匹配 几个常用的非贪婪匹配Pattern: ? .*?的用法: . 是任意字符 * 是取 0 至 无限长度 ? 是非贪婪模式。 和在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在: .*?x -----就是取前面任意长度的字符,直到一个x出现 ? import re re.findall(‘a‘,‘alvin yuan‘) #返回所有满足匹配条件的结果,放在列表里 re.search(‘a‘,‘alvin yuan‘).group() #函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以 # 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。 re.match(‘a‘,‘abc‘).group() #同search,不过尽在字符串开始处进行匹配 ret=re.split(‘[ab]‘,‘abcd‘) #先按‘a‘分割得到‘‘和‘bcd‘,在对‘‘和‘bcd‘分别按‘b‘分割 print(ret)#[‘‘,‘‘,‘cd‘] ret=re.sub(‘d‘,‘abc‘,‘alvin5yuan6‘,1) ret=re.subn(‘d‘,‘alvin5yuan6‘) obj=re.compile(‘d{3}‘) ret=obj.search(‘abc123eeee‘) print(ret.group())#123 import re ret=re.finditer(‘d‘,‘ds3sy4784a‘) print(ret) #<callable_iterator object at 0x10195f940> print(next(ret).group()) print(next(ret).group()) ? findall的优先级查询: import re ret=re.findall(‘www.(baidu|oldboy).com‘,‘www.oldboy.com‘) print(ret)#[‘oldboy‘] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可 ret=re.findall(‘www.(?:baidu|oldboy).com‘,‘www.oldboy.com‘) print(ret)#[‘www.oldboy.com‘] ? split的优先级查询: ret=re.split("d+","yuan2egon56alex") print(ret) ret=re.split("(d+)","yuan2egon56alex") print(ret) ? ? logging模块函数式简单配置: import logging logging.debug(‘debug message‘) logging.info(‘info message‘) logging.warning(‘warning message‘) logging.error(‘error message‘) logging.critical(‘critical message‘) 默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志 这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG) 默认的日志格式为日志级别:Logger名称:用户输出消息。 灵活配置日志级别,日志格式,输出位置: import logging logging.basicConfig(level=logging.DEBUG,format=‘%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s‘,datefmt=‘%a,%d %b %Y %H:%M:%S‘,filename=‘/tmp/test.log‘,filemode=‘w‘) logging.debug(‘debug message‘) logging.info(‘info message‘) logging.warning(‘warning message‘) logging.error(‘error message‘) logging.critical(‘critical message‘) ? 配置参数: logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有: filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。 filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。 format:指定handler使用的日志显示格式。 datefmt:指定日期时间格式。 level:设置rootlogger(后边会讲解具体概念)的日志级别 stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。 format参数中可能用到的格式化串: %(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用户输出的消息 ? ?logger对象配置: import logging logger = logging.getLogger() # 创建一个handler,用于写入日志文件 fh = logging.FileHandler(‘test.log‘) # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘) fh.setFormatter(formatter) ch.setFormatter(formatter) logger.addHandler(fh) #logger对象可以添加多个fh和ch对象 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.setLevel(logging.Debug)设置级别。当然,也可以通过fh.setLevel(logging.Debug)单对文件流设置某个级别。 ? 序列化模块(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |