一. time模块
1. 三种时间表示形式
在python中,表示时间通常有三种形式:时间戳,元组表示的结构化时间,格式化的字符串时间。
(1) 时间戳(timestamp):时间戳表示的是从1970年1月1日00:00:00开始按秒计算的浮点数类型的时间差。
(2) 元组表示的结构化时间(struct_time):struct_time元组共有9个元素:(年(tm_year),月(tm_mon),日(tm_day),时(tm_hour),分(tm_min),秒(tm_sec),星期几(tm_wday),一年中第几天(tm_yday),夏令时标识符(tm_isdst))
(3) 格式化的字符串时间(Format String):提供给用户看的时间,如’2017-06-21’。
2.三种时间形式的转换
a.
(1) 时间戳<–>结构化时间
import time
time.localtime(888888888) #localtime是当前时区时间
time.gmtime(88888888) #gmtimes是世界标准时间(UTC)
time.mktime(time.localtime()) #将当前结构化时间转换为时间戳
(2) 字符串时间<–>结构化时间
time.strftime(‘%Y-%m-%d’,time.localtime()) #将当前结构化时间装换为字符串时间
time.strptime(‘2017-06-21’,’%Y-%m-%d’) #将’2017-06-21’转换为对应的结构化时间
b.
time.asctime(time.localtime()) #将当前结构化时间转换为固定格式的字符串时间
转换后为:’Wed Jun 21 16:33:17 2017’
time.ctime(888888888) #将时间戳装换为固定格式的字符串时间
转换后为:’Tue Mar 3 09:34:48 1998’
3. sleep
time.sleep(2) #线程推迟2秒运行
二. random模块
import random
random.random() # 大于0且小于1之间的随机小数
random.randint(1,5) # 大于等于1且小于等于5之间的随机整数
random.randrange(1,3) # 大于等于1且小于3之间的随机整数
random.choice([1,'23',[4,5]]) # 从列表中随机选取一个元素
random.sample([1,'23',[4,5]],2) # 从列表中随机选取两个元素,返回它们的列表
random.uniform(1,3) #大于1小于3的随机小数
item = [1,2,3,4,5,6]
random.shuffle(item) # 打乱item的次序
三. hashlib
1. MD5
python中的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
以MD5为例:
import hashlib
md5 = hashlib.md5()
md5.update(b‘aaa’)
md5.update(b’bbb’)
print(md5.hexdigest()) # 最后返回的是b’aaabbb’调用MD5算法生成的字符串。
MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。
2. 加盐处理:
由于常用口令的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下为’\r\n’,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最后的文件名,即os.path.split(path)的第二个元素。如果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所指向的文件或目录的大小
五.sys模块
import sys
sys.argv 返回命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
六.logging模块
1.函数配置
默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,说明默认的日志级别为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),默认的日志格式为: 日志级别:日志级别等级:用户:输出消息。
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='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 字符串形式的当前时间。默认格式是 “2017-06-22 16:49:45,913”,逗号后面的是毫秒
%(thread)d 线程ID,可能没有
%(threadName)s 线程名,可能没有
%(process)d 进程ID,可能没有
%(message)s用户输出的消息
2.logger对象配置
import logging
logger = logging.getLogger()
fh = logging.FileHandler('test.log') # 创建一个handler,用于写入日志文件
ch = logging.StreamHandler() # 再创建一个handler,用于输出到控制台
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')
还可以使用Filter设置过滤日志信息的方法,通过logger.setLevel(logging.Debug)设置级别,或者通过fh.setLevel(logging.Debug)单对文件设置级别。
七.序列化模块
1. 序列化的定义:
我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
2.json模块
可用json序列化的数据类型包括字符串,数字,字典,列表,元组,bool型。其中字符串,数字,字典,元组,列表经过json序列化后都变为str型,具体变化为单引号变为双引号。
True/False变为true/false,None变为null。
import json
#-----------------------------序列化
dic={'name':'alvin','age':23,'sex':'male'}
data=json.dumps(dic)
f=open('序列化对象','w')
f.write(data) # data=json.dumps(dic) 和 f.write(data)两步等价于json.dump(dic,f)
f.close()
#-----------------------------反序列化<br>
import json
f=open('序列化对象')
new_data=json.loads(f.read())# 前两步等价于data=json.load(f)
f.close()
3.pickle模块
pickle模块用法与json一样,只是用pickle模块序列化后的数据类型为bytes,因此写入文件时用’wb’,反序列化时打开文件用’rb’。
八.configparser模块
该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)。
1. 常见格式:
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes
[bitbucket.org]
User = hg
[topsecret.server.com]
Port = 50022
ForwardX11 = no
2. 通过configparser模块生成这样的文档:
import configparser
config = configparser.ConfigParser()
config["DEFAULT"] = {'ServerAliveInterval': '45',
'Compression': 'yes',
'CompressionLevel': '9',
'ForwardX11':'yes'
}
config['bitbucket.org'] = {'User':'hg'}
config['topsecret.server.com'] = {'Host Port':'50022','ForwardX11':'no'}
with open('example.ini', 'w') as configfile:
config.write(configfile)
3. 查找文件
import configparser
config = configparser.ConfigParser()
#---------------------------查找文件内容,基于字典的形式
print(config.sections()) # []
config.read('example.ini')
print(config.sections()) # ['bitbucket.org', 'topsecret.server.com']
print('bytebong.com' in config) # False
print('bitbucket.org' in config) # True
print(config['bitbucket.org']["user"]) # hg
print(config['DEFAULT']['Compression']) #yes
print(config['topsecret.server.com']['ForwardX11']) #no
print(config['bitbucket.org']) #<Section: bitbucket.org>
for key in config['bitbucket.org']: # 注意,有default会默认增加default的键
print(key)
print(config.options('bitbucket.org')) # 同for循环,找到'bitbucket.org'下所有键
print(config.items('bitbucket.org')) #找到'bitbucket.org'下所有键值对
print(config.get('bitbucket.org','compression')) # yes get方法取深层嵌套的值
4. 增删改操作
import configparser
config = configparser.ConfigParser()
config.read('example.ini') #读取’example.ini’文件到config中
config.add_section('yuan') #增加section[yuan]
config.remove_section('bitbucket.org') #删除section
config.remove_option('topsecret.server.com',"forwardx11") #删除键值对
config.set('topsecret.server.com','k1','11111') #修改键值对,若没有则增加
config.set('yuan','k2','22222') #
config.write(open('new2.ini', "w")) #写入文件
九.subprocess模块
当我们需要调用系统的命令的时候,最先考虑的os模块。用os.system()和os.popen()来进行操作。但是这两个命令过于简单,不能完成一些复杂的操作,如给运行的命令提供输入或者读取命令的输出,判断该命令的运行状态,管理多个命令的并行等等。这时subprocess中的Popen命令就能有效的完成我们需要的操作。
subprocess模块允许一个进程创建一个新的子进程,通过管道连接到子进程的stdin/stdout/stderr,获取子进程的返回值等操作。
subprocess模块只一个类:Popen。
1. 简单命令
Linux:
import subprocess
#创建一个新的进程,与主进程不同步,在windows下: s=subprocess.Popen('dir',shell=True)
s=subprocess.Popen('ls') # s是Popen的一个实例对象
s.wait() # 等待s完成
print('ending...')
2. 带参数的命令
Linux:
import subprocess
subprocess.Popen('ls -l',shell=True)
#subprocess.Popen(['ls','-l'])
3. 控制子进程
可以在父进程中对子进程进行其它操作:
s.poll() #检查子进程状态
s.kill() #终止子进程
s.send_signal() #向子进程发送信号
s.terminate() #终止子进程
s.pid:子进程号
4. 子进程的文本流控制
可以在Popen()建立子进程的时候改变标准输入、标准输出和标准错误,并可以利用subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe):
import subprocess
# s1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
# print(s1.stdout.read())
#s2.communicate()
s1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE)
s2 = subprocess.Popen(["grep","0:0"],stdin=s1.stdout, stdout=subprocess.PIPE)
out = s2.communicate()
print(out)
注意:communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成