importlib模块

具有动态导入模块功能。

importimportlib

name= "time"module=importlib.import_module(name)print(module.time())

sys模块

有关python运行环境的变量和函数;

sys.argv:一个列表,包含脚本外部传入的参数,argv[0]为脚本名

sys.exit([arg]):退出当前程序,可指定返回值或错误信息

sys.modules:一个字典,导入的新模块,就会记录其中

sys.path:一个列表,包含模块所有搜索路径的字符串

sys.platform:一个字符串,包含当前的平台标识符

sys.version:Python解释器版本

sys.maxsize:获取最大int值,9223372036854775807

sys.stdin,sys.stdou,sys.stderr:解释器用于标准输入,输出和错误的文件对象

sys.getdefaultencoding(),sys.setdefaultencoding(),sys.getfilesystemencoding(),sys.getdefaultencoding():获取或设置系统当前编码

sys.getrecursionlimit(),sys.setrecursionlimit(n):获取或设置最大递归限制

os模块

访问多个操作系统服务;

os.getcwd():获取脚本工作的目录路径;

os.chdir(dirpath):改变脚本工作路径;

os.curdir:返回当前目录路径('.');

os.pardir:返回当前目录的父目录('..');

os.makedirs(dirpath):递归创建目录;

os.removedirs(dirpath):如果目录为空则删除,如果上级目录为空也删除,一直递归;

os.mkdir(dirpath):创建单级目录,存在则异常;

os.rmdir(dirpath):删除单级目录,不为空则异常;

os.listdir(dirpath):列出指定目录下的所有文件和目录,包括隐藏文件,返回一个list;

os.remove():删除一个文件;

os.rename(old,new):可移动或重命名一个文件或目录,与mv相似;

os.stat(dirpath):获取文件或目录的信息;

os.sep:操作系统特定的路径分隔符;

os.linesep:当前平台使用的行终止符;

os.pathsep:用于分割文件路径的字符串,PATH="/usr/bin/:$PATH";

os.name:字符串返回当前使用的平台windows -> 'nt',linux -> 'posix';

os.system('bash'):执行指定的shell命令,返回结果;

os.environ:获取系统环境变量;

os.path模块主要用于获取文件的属性;

os.path.abspath(path):返回path规范化绝对路径;

os.path.split(path):将path分割成目录和文件名,二元组返回(''dirpath,'filename')

os.path.dirname(path):返回path目录的绝对路径,'dirpath'

os.path.basename(path):返回path最后的文件名,如果时/结尾则返回空值;'filename'

os.path.exists(path):如果path存在,返回True

os.path.isabs(path):如果path是绝对路径,返回True

os.path.isfile(path):如果path是一个存在的文件,返回True

os.path.isdir(path):如果path是一个存在的目录,返回True

os.path.join(path1[,path2...]):将多个路径组合后返回,第一个绝对路径之前的参数将被忽略

os.path.join('/root/test/a','/app','python','a') ==> '/app/python/a'

os.path.getatime(path):返回path所指向的文件或目录的最后存取时间

os.path.getmtime(path):返回path所指向的文件或目录的最后修改时间

os.path.getsize(path):获取path文件的大小(字节)

fileinput模块

模块fileinput可以对一个或多个文件的内容所有行进行迭代、遍历等操作。

fileinput.input(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None):返回一个能够在for循环中迭代的对象;

# files:文件的路径列表;

# inplace:是否重写文件;

# backup:指定备份文件的扩展名,如.bak,如果存在该扩展名的文件,则覆盖;

# buffsize:缓冲区大小,文件过大时可修改;

# mode:读写模式,默认只读;

# openhook:打开钩子,不知道什么意思;

fileinput.filename():返回当前文件名;

fileinput.fileno():返回当问文件描述符

fileinput.lineno():返回当前已经读取行的数量;

fileinput.filelineno():返回当前读取的行号;

fileinput.isfirstline():当前行是否为第一行;

fileinput.isstdin():判断最后一行是否从stdin读取;

fileinput.nextfile():关闭当前文件,便于读取下个文件,未读取的行不会加进行数计数中;文件第一行被读后此函数才会有效,就是不可以跳过某个文件;

fileinput.close():关闭队列;

re模块

模块re提供了正则表达式支持;



.:一个任意字符,不包含换行符,DOTALL模式下包含换行符;*:0个或任意个前一个字符;+:1个以上前一个字符;

?:0个或1个前一个字符;

{}:自定义范围,默认贪婪模式匹配最大的^:开头;

$:结尾;

[...]:字符集,除了(^, -, \)其余的元字符都失去特殊含义;

[^str]:除了str以外的字符,意味着取反;

\:反斜杠后面跟元字符除去特殊含义,

\\, 去掉\的特殊含义,用来匹配字符\;在re里如果匹配一个\,就需要另一个\让它去掉特殊含义,但是\在Python解释器里是转移符,所以要分别对\和\进行转义,那么就会要传入'\\\\';如果不对\\转义,那么运行时Python解释器就认为它们是转移符,而不是字符\。也可以使用原生字符表示,r'\\'。

反斜杠后面跟普通字符实现特殊含义;

\d, 匹配任何十进制数,[0-9]

\D, 匹配任何非数字字符,[^0-9]

\s, 匹配任何空白字符,[ \t\n\r\f\v]

\S, 匹配任何非空白字符,[^\t\n\r\f\v]

\w, 匹配任何字母数字字符,[a-zA-Z0-9_]

\W, 匹配任何非字母数字字符,[^a-zA-Z0-9_]

\b, 匹配单词和特殊字符的边界,'I am a LI#ST'中第一个I与后面空格的边界,第二个I与#的边界都会被捕捉

|:先匹配左侧,不通过再匹配右侧;

():分组,可以设置组名;

元字符



当一个pattern匹配字符串时,会匹配尽可能多的内容,

pattern=re.compile(r'\*\*(.+)\*\*')

re.findall(pattern,'**This** is **it**!')

['This** is **it']  #一直匹配到最后一个\*\*

对于所有的重复运算符,都可在后面加上问号来将其指定为非贪婪的;

pattern=re.compile(r'\*\*(.+?)\*\*')

re.findall(pattern,'**This** is **a** **dog**!')

['This', 'a', 'dog']  #只匹配到下一个\*\*

贪婪模式



re.I(IGNORECASE):忽略大小写

re.M(MULITELINE):多行匹配,影响^和 $

re.S(DOTALL):使'.'包含换行符在内的所有字符

re.U(UNICODE):表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库

re.X(VERBOSE):为了增加可读性,忽略空格和'#'后面的注释

匹配方式FLAGS

re.compile(pattern[,flag]):生产一个pattern对象;flags为匹配模式;

re.match(pattern,string[,flags]):从string的起始位置匹配pattern,返回一个对象,可调用group方法获取值;如果开头没有匹配成功,返回none;

re.search(pattern,string[,flags]):匹配出满足条件的第一个结果,返回一个对象,可调用group方法获取值;

re.split((pattern,string[,max=0,flags])):返回一个列表,包含根据pattern分割后的字符串,max最大分割次数;

re.findall(pattern,string[,flags]):返回一个列表,包含字符串中所有被匹配的子串;如果规则里有(),只返回()中匹配的内容;

re.finditer(pattern,string[,flags]):与findall一样,但返回的是一个迭代器;

re.sub(pattern,repl,string,max=0):将staring中的匹配到的字符替换为repl,repl可为函数,max为替换最大次数,默认0为所有;

time模块

模块time能够获取修改多种格式时间;



(2018,11,20,11,8,13,1,324,0)

(tm_year=2018, tm_mon=11, tm_mday=20, tm_hour=11, tm_min=8, tm_sec=13, tm_wday=1, tm_yday=324, tm_isdst=0);

四位年数,月,日,时,分,秒,周(0为周一),一年的第几日,夏令时(1夏令时、0不是夏令时、-1未知);

时间元组



%y:两位年份(00-99)%Y:四位年份(000-9999)%m:月份(01-12)%d:天(01-31)%w:周(0-6)是0周一%H:时(0-23)%M:分(0-59)%S:秒(0-59)%x:本地相应的日期表示%X:本地相应的时间表示%a:本地简化星期名称%b:本地简化的月份名称%Z:当前时区的名称

时间格式

time.sleep(secs):sleep;

time.time():返回当前系统时间戳,1542691945.7587576;

time.ctime([secs]):将时间戳转换为可读时间,无参时返回当前系统时间,'Tue Nov 20 13:32:25 2018';

time.localtime([secs]):转换为当地时间下的元组时间,无参时返回当前系统时间,time.struct_time(tm_year=2018, tm_mon=11, tm_mday=20, tm_hour=13, tm_min=32, tm_sec=25, tm_wday=1, tm_yday=324, tm_isdst=0);

time.gmtime([secs]):转换为格林威治天文时间下的元组时间,无参时返回当前系统时间,time.struct_time(tm_year=2018, tm_mon=11, tm_mday=20, tm_hour=5, tm_min=32, tm_sec=25, tm_wday=1, tm_yday=324, tm_isdst=0);

time.mktime(tupletime):将元组时间转换为时间戳,

time.asctime([tupletime]):接受元组时间返回可读形式时间,

time.strftime(fmt[,tupletime]):将元组时间转换为指定格式的当地时间,strftime("%Y-%m-%d %H:%M:%S",time.localtime());

time.strptime(str,fmt='%a %b %d %H:%M:%S %Y'):与strftime相反,根据指定格式将字符串时间转换为tupletime,strptime("30 Nov 00", "%d %b %y")

random模块

模块random包含生产伪随机数的函数,有助于编写模拟程序或生成随机输出的程序;

random.random():返回一个0~1(含)的随机实数;

random.uniform(a,b):返回一个a~b(含)的随机实数;

random.randint(a,b):返回一个a~b(含)的随机整数;

random.randrange([start,]stop[,step]):从range(start, stop, step)中随机选择一个数;

random.choice(seq):从序列seq中随机选择一个;

random.shuffle(seq,[random]):打乱序列,洗牌;

random.sample(seq,n):从制定的序列中随机选择n个元素;

hashlib模块

hashlib模块为一些消息摘要算法(algorithm)提供了公共接口,如MD5, SHA1, SHA224, SHA256, SHA384和SHA512。加密过程是不可逆的。

MD5是最常见的摘要算法,速度很快,生成一个128bit的散列值(hash value),通常用一个32位的16进制字符串表示。

如果想对一个明文进行加密,首先要定义一个md5类型的加密器对象,打印加密器可以看到是一个md5 hash object,然后调用update方法加密明文;通过调用hexdigest()方法可以获取加密密文,是一个十六进制的32位字符串。

import hashlib

encryption = hashlib.md5()

encryption.update('hello '.encode('utf8'))

encryption.update('world!'.encode('utf8'))

print(encryption.hexdigest())

#运行结果

fc3ff98e8c6a0d3087d515c0473f8677

pickle模块

可以通过tumps和loads方法对数据进行操作,序列化后的数据为bytes类型,反序列化后的数据为str类型。



importpickle

user_info= {'name': 'Alice', 'age': 28}#序列化

bytes_data =pickle.dumps(user_info)print(bytes_data) #b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x05\x00\x00\x00Aliceq\x02X\x03\x00\x00\x00ageq\x03K\x1cu.'#反序列化

str_data =pickle.loads(bytes_data)print(str_data) #{'name': 'Alice', 'age': 28}

pickle



importpickleclassPerson():def __init__(self, name):

self.name=namedeftalk(self):print('i am %s' %self.name)

p= Person('Alice')

with open('pickle.txt', 'wb') as f:

bytes_data=pickle.dump(p, f)

with open('pickle.txt', 'rb') as f:

str_data=pickle.load(f)

str_data.talk()#i am Alice

pickle持久化

json模块

pickle可以很方便地序列化所有对象。不过json作为更为标准的格式,具有更好的可读性(pickle是二进制数据)和跨平台性。



importjson

user_info= {'name': 'Alice', 'age':28, 'job': ['IT','Teacter']}

bytes_data=json.dumps(user_info)print(bytes_data) #{"name": "Alice", "age": 28, "job": ["IT", "Teacter"]}

str_data=json.loads(bytes_data)print(str_data) #{'name': 'Alice', 'age': 28, 'job': ['IT', 'Teacter']}

json

json只能实例化python的基础数据类型,一些复杂的数据类型需要手动处理。可以自定义处理类;



#引入django中form验证错误的数据类型ValidationError

from django.core.exceptions importValidationError#定义一个json数据转换的类

classFormJson(json.JSONEncoder):#定义default转换函数

defdefault(self, obj):#如果数据是这种类型,那么就按照下面格式输出

#这里可以自定义一些特殊数据类型的处理方式

ifisinstance(obj, ValidationError):return {'code': obj.code, 'message': obj.message}else:#其他的类型都还是按照json默认的方式处理

return json.JSONEncoder.default(self, obj)

自定义解析类

shelve模块

shelve是python中用来持久化存储的模块,类似于一个key-value的数据库,key必须时str类型,value可以是python中任意的数据类型,也可以是自己定义的数据类型。



importshelve

age= 28job_list= ['IT', 'Teacher']defrun(name):print('name: %s' %name)

with shelve.open('shelve') as f:

f['run'] =run

f['age'] =age

f['job'] =job_list

with shelve.open('shelve') as f:

foo= f['run']

num= f['age']

l= f['job']

foo('Alice') #name: Alice

print(num) #28

print(l) #['IT', 'Teacher']

shelve

ConfigParser模块

此模块提供ConfigParser实现基本配置语言的类,生成和修改常见配置文档;格式如下:

[DEFAULT]

log=debug

state=alive

[mysql]

db_user=root

db_pass= 123[time]

zone= Asia/Shanghai



importconfigparser#实例化一个解析器

conf_file =configparser.ConfigParser()#添加数据

conf_file['DEFAULT'] = {'log':'debug','state':'alive'}

conf_file['mysql'] = {'db_user':'root','db_pass':123}

conf_file['time'] = {'zone':'Asia/Shanghai'}#将解析器处理过的内容写入文件

with open('system.conf','w') as f:

conf_file.write(f)

创建文件写入内容



importconfigparser#实例化一个解析器

conf_file =configparser.ConfigParser()#解析器读取到文件

conf_file.read('system.conf',encoding='utf8')#返回[deflaut]范围的字典

default =conf_file.defaults()print(default)#返回sections的一个列表,deflaut不会被返回

sections =conf_file.sections()print(sections)#返回指定section中option的列表,包含DEFAULT中的option

options = conf_file.options('mysql')print(options)#返回具体option的值

mysql_user = conf_file.get('mysql', 'db_user')print(mysql_user)

mysql_passwd= conf_file['mysql']['db_pass']print(mysql_passwd)#运行结果

OrderedDict([('log', 'debug'), ('state', 'alive')])

['mysql', 'time']

['db_user', 'db_pass', 'log', 'state']

root123

读取文件中的内容



importconfigparser

conf_file=configparser.ConfigParser()

conf_file.read('system.conf')#重新设置section中option的值

conf_file.set('mysql', 'db_pass', 'abc123')#删除整个section

conf_file.has_section('time') #True

conf_file.remove_section('time')#删除指定的option

conf_file.has_option('mysql', 'db_user') #True

conf_file.remove_option('mysql', 'db_user')#将变动重新写入文件

conf_file.write(open('system.conf', 'w'))

删除文件中指定的内容

logging模块

logging模块定义了为应用程序和库实现灵活事件日志记录系统的函数和类。

日志级别:logging默认WARNING

CRITICAL = 50FATAL=CRITICAL

ERROR= 40WARNING= 30WARN=WARNING

INFO= 20DEBUG= 10NOTSET= 0

logging模块级函数:

下面是通过模块中的函数打印日志,在终端上显示。并且root logger默认是WARNING日志级别,所以只打印出WARNING级别以上的日志信息。

import logging

logging.debug('DEBUG LOG')

logging.info('INFO LOG')

logging.warning('WARNING LOG')

logging.error('ERROR LOG')

logging.critical('CRITICAL LOG')

logging.log(logging.CRITICAL,'CRITICAL LOG')

logging.log(40,'level 40 LOG') #可以使用日志等级数

#运行结果

#由于logging默认为warning级别,所以debug, info不会被打印

WARNING:root:WARNING LOG

ERROR:root:ERROR LOG

CRITICAL:root:CRITICAL LOG

CRITICAL:root:CRITICAL LOG

ERROR:root:level 40 LOG

basicConfig(**kw)方法通过StreamHandler使用默认值创建Formatter并将其添加到根记录器来为日志记录系统执行基本配置。

filename: 指定使用指定的文件名创建FileHandler。

filemode: 如果指定了filename,通过此模式打开文件,默认为'a'。

format: 指定处理日志信息的字符串格式。

datefmt: 指定日期时间格式,使用元组时间格式。

level: 指定日志级别。

stream: 指定一个stream初始化StreamHandler,与filenam不相容。

handlers: 指定一个Handler

import logging

logging.basicConfig(

filename='file.log',

filemode='a',

format='%(asctime)s %(filename)s %(name)s %(levelno)s %(message)s',

datefmt="%Y-%m-%d %H:%M:%S %p",

level=10

)

logging.debug('DEBUG LOG')

logging.error('ERROR LOG')

#运行结果

#会在同级目录下生成文件‘file.log’,并以追加模式写入两行debug、error日志

2019-04-30 17:44:29 PM model_logging.py root 10 DEBUG LOG

2019-04-30 17:44:29 PM model_logging.py root 40 ERROR LOG

Logger Objects

记录器公开应用程序代码直接使用的接口;’Logger永远不会直接实例化,而是始终通过模块级函数实例化logging.getLogger(name)。

Headler Objects

处理程序将日志记录(由记录器创建)发送到适当的目标(文件、终端);Handler永远不会直接实例化,只是充当FileHandler文件处理和StreamHandler流处理等类的父类。

Formatter Objects

指定最终输出中日志记录的布局;如果未提供,则使用默认值'%(message)s',该值仅包括日志记录调用中的消息。

Filter Objects

过滤器提供了更精细的设施,用于确定要输出的日志记录;Filters可以用于Handlers和Loggers更复杂的过滤,而不是由级别提供。

一个日志处理系统可以由以上四个基本类构建成,并且能够对显示方式、过滤规则、日志格式自定义设置。

import logging

# 生成一个logger日志记录器

logger = logging.getLogger()

# 实例化一个文件处理器和流处理器

fileHandler = logging.FileHandler('system.log',mode='w') #默认模式为'a'

stremHandler = logging.StreamHandler()

# 实例化一个格式化器,并指定了一定的格式,username为自定义参数

formatter = logging.Formatter('%(asctime)s %(filename)s %(username)s %(levelname)s: %(message)s')

# 为处理器设置Formatter的格式

fileHandler.setFormatter(formatter)

stremHandler.setFormatter(formatter)

# 将处理器添加至logger记录器里

logger.addHandler(fileHandler)

logger.addHandler(stremHandler)

# 为logger记录器设置日志级别

logger.setLevel(logging.INFO)

# 此时logger记录器就拥有了两个自定义的处理器,并且两个处理器还指定了固定的格式

#格式化中自定义了参数,执行时需添加参数

logger.debug('debug-log', extra={'username': 'root'})

logger.info('info-log', extra={'username': 'root'})

logger.warning('warning-log', extra={'username': 'admin'})

logger.error('error-log', extra={'username': 'admin'})

logger.critical('critical-log', extra={'username': 'admin'})

#运行结果

2019-05-09 15:19:08,355 model_logging.py root INFO: info-log

2019-05-09 15:19:08,355 model_logging.py root WARNING: warning-log

2019-05-09 15:19:08,355 model_logging.py admin ERROR: error-log

2019-05-09 15:19:08,355 model_logging.py admin CRITICAL: critical-log