1.导入模块方法
import
module
from
module.xx.xx
import
xx
from
module.xx.xx
import
xx as rename
from
module.xx.xx
import
*
1、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()) # 1537550201.7291784 # 时间结构 print(time.localtime()) # time.struct_time(tm_year=2018, tm_mon=9, tm_mday=22, tm_hour=1, tm_min=19, tm_sec=50, tm_wday=5, tm_yday=265, tm_isdst=0) print(time.localtime().tm_year) # 2018 # 结构化时间转换为字符串时间 print(time.strftime("%Y-%m-%d %X", time.localtime())) # 2018-09-22 01:34:01 print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) # 2018-09-22 01:34:01 # 字符串时间转换为结构化时间 print(time.strptime("2018-09-22 01:34:01", "%Y-%m-%d %H:%M:%S")) # time.struct_time(tm_year=2018, tm_mon=9, tm_mday=22, tm_hour=1, tm_min=34, tm_sec=1, tm_wday=5, tm_yday=265, tm_isdst=-1) # print(time.asctime()) # Sat Sep 22 01:40:29 2018 print(time.ctime()) # Sat Sep 22 01:40:29 2018 # datetime模块 import datetime print(datetime.datetime.now()) # 2018-09-22 01:44:16.817567
2、random
# random模块 import random print(random.random() * 1000) # 893.8943826322712 print(random.randint(0, 9)) # 1到100 print(random.randrange(1, 100)) # 1到99 print(random.choice([32, 23, 5, 3])) # 随机选一个 print(random.sample([32, 23, 5, 3, 2], 3)) # 随机选3个 # 四位数随机验证码 A-Z 65-90 a-z 97-122 0-9 def ident_code(num=4): res = "" for i in range(num): num1 = str(random.randint(0, 9)) a = chr(random.randint(65, 90)) b = chr(random.randint(97, 122)) res += random.choice([num1, a, b]) return res print(ident_code())
3、sys BASE_DIR
用于提供对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.stderror 错误相关
# BASER_DIR 添加环境变量
import sys, os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
# from package import module
print(__file__) # C:/Disk_D/pycharm_stu/svn/python/macboy/study/模块.py
print(os.path.dirname(__file__)) # C:/Disk_D/pycharm_stu/svn/python/macboy/study
print(BASE_DIR) # C:/Disk_D/pycharm_stu/svn/python/macboy
# 进度条
for i in range(11):
time.sleep(0.1)
sys.stdout.write('#')
sys.stdout.flush()
4、os
用于提供系统级别的操作:
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取当前目录的父目录字符串名:('..') os.makedirs('dir1/dir2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.remove() 删除一个文件 os.rename("oldname","new") 重命名文件/目录 os.stat('path/filename') 获取文件/目录信息 os.sep 操作系统特定的路径分隔符,win下为"\",Linux下为"/" os.linesep 当前平台使用的行终止符,win下为" ",Linux下为" " 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所指向的文件或者目录的最后修改时间
5、序列化
Python中用于序列化的两个模块
- json 用于【字符串】和 【python基本数据类型】 间进行转换 序列化字符串
- pickle 用于【python特有的类型】 和 【python基本数据类型】间进行转换 序列化字节 也可以序列化对象
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
# json json字符串必须是双引号 # dumps 字典序列化为json格式 # loads json格式反序列化为dict import json dic = {'name': 'zq', 'age': 101} print(json.dumps(dic)) # {"age": 101, "name": "zq"} with open('json_text.txt', "w", encoding='utf-8') as f: f.write(json.dumps(dic) + " ") l = [] with open('json_text.txt', encoding='utf-8') as f: for i in f: l.append(json.loads(i.strip())) for i in range(len(l)): print("名字是:%s,年龄是:%s" % (l[i]['name'], l[i]['age'])) # 名字是:zq,年龄是:101
# pickle 序列化bit流 import pickle d = {'name':'zxq','age':12} d_dumps = pickle.dumps(d) #生成bit流 print(d_dumps) d_loads = pickle.loads(d_dumps) #反序列化字典 print(d_loads)
6、xml
7、re
python中re模块提供了正则表达式相关操作
字符:
. 匹配除换行符以外的任意字符
w 匹配字母或数字或下划线或汉字
s 匹配任意的空白符
d 匹配数字
匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
次数:
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
#match(pattern, string, flags=0)
# pattern: 正则模型
# string : 要匹配的字符串
# falgs : 匹配模式
# search,浏览整个字符串去匹配第一个,未匹配成功返回None
# search(pattern, string, flags=0)
# findall,获取非重复的匹配列表;如果有一个组则以列表形式返回,且每一个匹配均是字符串;如果模型中有多个组,则以列表形式返回,且每一个匹配均是元祖;
# 空的匹配也会包含在结果中
# findall(pattern, string, flags=0)
# sub,替换匹配成功的指定位置字符串
#sub(pattern, repl, string, count=0, flags=0)
# pattern: 正则模型
# repl : 要替换的字符串或可执行对象
# string : 要匹配的字符串
# count : 指定匹配个数
# flags : 匹配模式
# split,根据正则匹配分割字符串
#split(pattern, string, maxsplit=0, flags=0)
# pattern: 正则模型
# string : 要匹配的字符串
# maxsplit:指定分割个数
# flags : 匹配模式
推荐格式:
pattern = "正则匹配项"
re.compile(pattern).findall("内容")
'''
参考
https://www.cnblogs.com/tina-python/p/5508402.html
常用匹配
ip地址 ipaddr = r'(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
手机号 phone_num = r'1d{10}'
邮箱 email = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,4}"
链接地址 url = r"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*,]|(?:%[0-9a-fA-F][0-9a-fA-F]))+"
'''
匹配ip地址
content = ['dfdui256.3.1.1d=1232 df', 'abdffuid=22222 dfsf', '256.5.1.24dffd', 'fdsuid=rrfa', '1.2.1.2', '2.2.2.2','电放费256.1.1.1d']
ipaddr1 = r'(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' #['1.2.1.2', '2.2.2.2']
ipaddr2 = r'w(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' #['256.3.1.1', '256.5.1.24', '256.1.1.1']
ipaddr3 = r'w*(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' #['dfdui256.3.1.1', '256.5.1.24', '1.2.1.2', '2.2.2.2', '电放费256.1.1.1']
pattern = r"wuid=(d+)"
pattern1 = r"(d+)" # ['3', '1', '1232', '22222', '256', '5', '1', '1', '2', '1', '2', '2', '2', '2', '2', '1', '1']
res_ip = re.compile(ipaddr1)
list_ip = []
for i in content:
res = res_ip.findall(i)
if len(res) > 0:
list_ip += res
print(list_ip)
8、configparser
configparser用于处理特定格式的文件,其本质上是利用open来操作文件。
# configparser模块 # 创建文件 ''' [DEFAULT] forwardx11 = yes [default] serveraliveinterval = 45 compressionlevel = 9 compression = yes [bitbucket.org] user = hg [topsecret.server.com] host port = 50022 forwardx11 = no [MYSQL] ip addr = 10.1.1.1 host port = 3306 user name = zxq pssword = zxq ''' import configparser as confpar data = {'ServerAliveInterval': '45', 'Compression': 'yes', 'CompressionLevel': '9', } config = confpar.ConfigParser() # 生成对象 config["default"] = data # 将字典写入 config['bitbucket.org'] = {} # 用生成类似文件内容头 config['bitbucket.org']['User'] = 'hg' # 内容头添加字段 config['topsecret.server.com'] = {} topsecret = config['topsecret.server.com'] topsecret['Host Port'] = '50022' # topsecret['ForwardX11'] = 'no' # config['DEFAULT']['ForwardX11'] = 'yes' config['MYSQL'] = {} mysqlconf = config['MYSQL'] mysqlconf['Ip Addr'] = '10.1.1.1' mysqlconf['Host Port'] = '3306' mysqlconf['User Name'] = 'zxq' mysqlconf['Password'] = 'zxq' with open('config.ini', 'w', encoding='utf-8') as f: config.write(f)
# configparse 文件操作 增删改查 import configparser as confpar config = confpar.ConfigParser() config.read('config.ini') # 查询 print(config.sections()) # ['default', 'bitbucket.org', 'topsecret.server.com', 'MYSQL'] print(config.options('MYSQL')) # ['ip addr', 'host port', 'user name', 'pssword', 'forwardx11'] print(config.items( "MYSQL")) # [('forwardx11', 'yes'), ('ip addr', '10.1.1.1'), ('host port', '3306'), ('user name', 'zxq'), ('pssword', 'zxq')] print(config['MYSQL']['ip addr']) # 10.1.1.1 print(config.get("MYSQL", "ip addr")) # 10.1.1.1 # 添加 # config.add_section('TEST') # 添加标签头 # config.set('TEST', 'age', '10') # 添加内容 # 显示 # [TEST] # age = 10 # 删除 # config.remove_option('TEST', 'name') # config.remove_section("TEST") # 修改 # config.set('TEST', 'name', 'zhangsan') # print(config.get("TEST", "name")) # 保存 # config.write(open('config.ini', 'w'))
9、logging
用于便捷记录日志且线程安全的模块
日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
默认情况下logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING,默认的日志格式为日志级别:Logger名称:用户输出消息。
logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有
filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
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用户输出的消息
# 模块logging import logging as log import time file_name = "access_"+str(time.strftime("%Y%m%d", time.localtime()))+".log" log.basicConfig( level=log.ERROR, # 日志级别 filename=file_name, # 保存的文件名 filemode='a', # 文件打开没事 format="%(asctime)s %(levelno)s %(message)s" ) log.debug('debug message') log.info('info message') log.warning('warning message') log.error('error message') log.critical('critical message')
# 显示
# 2019-02-27 17:58:24,829 40 error message
# 2019-02-27 17:58:24,829 50 critical message
# 2019-02-27 17:58:26,463 40 error message
# 2019-02-27 17:58:26,469 50 critical message
# 2019-02-27 17:58:27,877 40 error message
# 2019-02-27 17:58:27,877 50 critical message
logger对象:
上述几个例子中我们了解到了logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical()(分别用以记录不同级别的日志信息),logging.basicConfig()(用默认日志格式(Formatter)为日志系统建立一个默认的流处理器(StreamHandler),设置基础配置(如日志级别等)并加到root logger(根Logger)中)这几个logging模块级别的函数,另外还有一个模块级别的函数是logging.getLogger([name])(返回一个logger对象,如果没有指定名字将返回root logger)
import logging as log import time file_name = "access_"+str(time.strftime("%Y%m%d", time.localtime()))+".log" def logger(root='root'): logger = log.getLogger(root) # 创建log对象 logger.setLevel("ERROR") # 定义日志级别 fm = log.Formatter("%(asctime)s | %(name)s | %(levelname)s | %(module)s:%(message)s", datefmt='%Y-%m-%d %H:%M:%S %p', ) # 日志格式 fileh = log.FileHandler(file_name) # 创建一个handler,用于写入日志文件 fileh.setFormatter(fm) logger.addHandler(fileh) streamh = log.StreamHandler() # 再创建一个handler,用于输出到控制台 streamh.setFormatter(fm) logger.addHandler(streamh) return logger l = logger() l.debug('debug message') l.info('info message') l.warning('warning message') l.error('error message') l.critical('critical message') # 显示 # 2019-02-27 18:21:24 PM | root | ERROR | test:error message # 2019-02-27 18:21:24 PM | root | CRITICAL | test:critical message # 2019-02-27 18:21:26 PM | root | ERROR | test:error message # 2019-02-27 18:21:26 PM | root | CRITICAL | test:critical message # 2019-02-27 18:21:27 PM | root | ERROR | test:error message # 2019-02-27 18:21:27 PM | root | CRITICAL | test:critical message
10.hashlib
用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 解密网站:https://cmd5.com/
# hashlib import hashlib # 简单用法 # ######## md5 ######## hash = hashlib.md5() # help(hash.update) hash.update(bytes('admin', encoding='utf-8')) print(hash.hexdigest()) print(hash.digest()) # 加盐 import hashlib # ######## md5 ######## hash = hashlib.md5(bytes('df23df12sf', encoding="utf-8")) hash.update(bytes('admin', encoding="utf-8")) print(hash.hexdigest()) # hmac import hmac h = hmac.new(bytes('898oaFs09f', encoding="utf-8")) h.update(bytes('admin', encoding="utf-8")) print(h.hexdigest())
11.subprocess
call
执行命令,返回状态码
check_call
执行命令,如果执行状态码是 0 ,则返回0,否则抛异常
check_output
执行命令,如果状态码是 0 ,则返回执行结果,否则抛异常
import subprocess ret = subprocess.call(["ls", "-l"], shell=False) ret = subprocess.call("ls -l", shell=True) subprocess.check_call(["ls", "-l"]) subprocess.check_call("exit 1", shell=True) subprocess.check_output(["echo", "Hello World!"]) subprocess.check_output("exit 1", shell=True)
subprocess.Popen(...)
用于执行复杂的系统命令
subprocess.PIPE
在创建Popen对象时,subprocess.PIPE可以初始化stdin, stdout或stderr参数。表示与子进程通信的标准流。
import subprocess
cmd = input(">>: ").strip()
cmd = '''netstat -ant | awk '/tcp/{print $5}' | cut -d ":" -f1 |grep -v "^$" | grep -v "0.0.0.0" |uniq'''
res = subprocess.Popen(cmd, shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE)
res_error = res.stderr.read() # 读取错误信息标准流
res_out = res.stdout.read() # 读取正确信息标准流
print(res_error.decode("gbk"))
print(res_out.decode("gbk"))
参数:
- args:shell命令,可以是字符串或者序列类型(如:list,元组)
- bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲
- stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
- preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
- close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。
所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。 - shell:同上
- cwd:用于设置子进程的当前目录
- env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
- universal_newlines:不同系统的换行符不同,True -> 同意使用
- startupinfo与createionflags只在windows下有效
将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等
12.struct
import struct
length_data = len("alldata") #7个字节
print(length_data) # 7
length = struct.pack('i',length_data) #生成bit流
print(length) # b'x07x00x00x00'
length_data=struct.unpack('i',length) #是一个tuple
print(length_data[0]) # 7
参考:
http://www.cnblogs.com/wupeiqi/articles/5501365.html
http://www.cnblogs.com/yuanchenqi/articles/5732581.html