namedtuple
# 使用可以用名字来访问元素内容的tuple
from collections import namedtuple
Point = namedtuple("Point", ['x', 'y'])
p = Point(1, 2)
print(p.x, p.y) # 坐标使用比较多
deque
# 由于列表是线性结构导致插入和删除元素很慢,deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
q.popleft()
print(q) # deque([ 'a', 'b', 'c', 'x'])
Orderedict
# python3.6 之前字典无序 使用OrderedDict保证有序
from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od) # OrderedDict的Key是有序的
defaultdic
# 当字典中key不存在时,默认返回一个默认值
from collections import defaultdict
dic1 = defaultdict(lambda: '不存在')
dic1['key1'] = 1
print(dic1['key2']) # key2不存在,返回默认值
dic2 = {"key1": 1}
print(dic2.get("key2")) # 返回None
Counter
# 统计出现次数,无序的容器,使用字典形式存储
from collections import Counter
b = Counter("-3.1415926abcd3.1415926")
print(b)
import random
random.random() # 生成大于0小于1之间的小数
random.uniform(1, 3) # 生成大于1小于3之间的小数
random.randint(1, 5) # 生成大于1小于5之间的整数
random.randrang(1, 10, 2) # 生成大于1小于10之间的奇数
random.choice([1, 'b', [4,5]]) # 随机选择一个返回
random.sample([1, 'b', [4,5]], 2) # 选择2个组合 [1, [4,5]]
item = [1, 3, 5, 7]
random.shuffle(item) # 打乱顺序
# 时间可以转行为三种形式
# 1.时间戳 1592536668.0
# 2.格式化时间 2020-06-19 11:17:48
# 3.元组 time.struct_time(tm_year=2020, tm_mon=6, tm_mday=19, tm_hour=11, tm_min=17, tm_sec=48, tm_wday=4, tm_yday=171, tm_isdst=0)
import time
print(time.time()) # 显示当前时间-时间戳
print(time.strftime("%Y-%m-%d %H:%M:%S")) # 显示当前时间-格式化时间
print(time.localtime()) # 显示当前时间-元组
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) # 将元组时间转行为格式化时间
print(time.gmtime(time.time())) # 将时间戳转换为元组
print(time.localtime(time.time())) # 将时间戳转换为元组
print(time.mktime(time.localtime())) # 将元祖转换为时间戳
print(time.strptime("2020-06-19", "%Y-%m-%d")) # 将特定格式时间转行为元组
# 计算时间差
import time
true_time = time.mktime(time.strptime('2018-03-19 08:30:00', '%Y-%m-%d %H:%M:%S'))
time_now = time.mktime(time.strptime('2020-06-19 11:27:00', '%Y-%m-%d %H:%M:%S'))
dif_time = time_now - true_time
struct_time = time.gmtime(dif_time)
print('过去了%d年%d月%d天%d小时%d分钟%d秒' % (struct_time.tm_year - 1970, struct_time.tm_mon - 1,
struct_time.tm_mday - 1, struct_time.tm_hour,
struct_time.tm_min, struct_time.tm_sec))
# 一般做时间计算比较多
# datetime模块时间默认都是转换为 %Y-%m-%d %H:%M:%S 这种格式
print(datetime.datetime.now()) # 当前时间
print(datetime.date(2020, 6, 19)) # 参数为年月日
print(datetime.time(15, 16, 17)) # 参数为时分秒
print(datetime.datetime(2020, 6, 19, 15, 16, 17)) # 参数为年月日时分秒
# timetimedelta 做时间计算使用
# 常用的参数是days、seconds、minutes、hours、weeks
print(datetime.datetime.now() + datetime.timedelta(weeks=3)) # 三周后
print(datetime.datetime.now() + datetime.timedelta(days=-3)) # 三天前
# fromtimestamp 将时间戳转换为时间
print(datetime.date.fromtimestamp(1592551677.2628834)) # 2020-06-19
#当前执行这个python文件的工作目录相关的工作路径
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 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'# 和执行系统命令相关
os.system("bash command") 运行shell命令,直接显示
os.popen("bash command").read()) 运行shell命令,获取执行结果
os.environ 获取系统环境变量#path系列,和路径相关
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不存在,返回Falseos.path.isabs(path) 如果path是绝对路径,返回Trueos.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回Falseos.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回Falseos.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小
# sys模块是与python解释器交互的一个接口
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version 获取Python解释程序的版本信息
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
注意:
# 对含有日期格式数据的json数据进行转换
import json
from datetime import datetime
from datetime import date
class JsonCustomEncoder(json.JSONEncoder):
def default(self, field):
if isinstance(field,datetime):
return field.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(field,date):
return field.strftime('%Y-%m-%d')
else:
return json.JSONEncoder.default(self,field)
d1 = datetime.now()
dd = json.dumps(d1,cls=JsonCustomEncoder)
print(dd)
# 逐行读取pickle存储数据
import pickle
with open("admin", mode="rb") as f1:
while True:
try:
obj = pickle.load(f1)
print(obj, end="")
except EOFError:
break
# 加密模块
import hashlib
m = hashlib.md5()
# m = hashlib.md5("salt".encode("utf-8")) # 将密码加盐,防止简单密码可通过撞库得到
# m = hashlib.sha1()
# m = hashlib.sha512()
m.update(b'abcdef')
m.update(b'demo') # update可以多次调用,在上一次基础上再次加密
print(m.hexdigest()) # 421fc0f2703c0576ca391abf4dfe0b1c
# print(m.hexdigest()) # 加盐版本:622ee8086368aa7acd237506f5842779
import hmac
import os
h = hmac.new(b'hello', os.urandom(16))
ret = h.digest()
print(ret)
# hmac 做一些网络连接验证,替代hashlib模块
# os.urandom(16) 随机生成16位byte类型字符
ret = re.split("\d+", "abc123def")
print(ret) # [abc, def]
ret = re.split("\d(\d)\d", "abc123def")
print(ret) # [abc, 2, def]
ret = re.sub("\d", "-", "abc123def", 2)
print(ret) # abc--3def
ret = re.subn("\d", "-", "abc123def")
print(ret) # ('abc---def', 3)
ret = re.match("\d+", "123abc123def")
print(ret) # <_sre.SRE_Match object; span=(0, 3), match='123'>
print(ret.group()) # 123
ret = re.compile("\d+")
res = ret.search("123abc") # res = ret.findall("123abc")
print(res)
ret = re.finditer("\d+", "123abc...")
for i in ret:
print(i.group())
ret = re.compile("\d+")
res = ret.finditer("abc123...")
for i in res:
print(i.group())
ret = re.search('\d(\d)\d(\w+?)(\d)(\w)\d(\d)\d(?P\w+?)(\d)(\w)\d(\d)\d(?P\w+?)(\d)(\w)',
'123abc45678agsf_123abc45678agsf123abc45678agsf')
print(ret.group('name1'))
print(ret.group('name2'))
exp = '我是一段文字,希望匹配上
乱码文字和乱码标签不希望匹配到的地方'
ret = re.search('<(?P\w+)>.*?(?P=tag)>', exp) # 这样就匹配不到
print(ret)
import shutil
# 拷贝文件
shutil.copy2('原文件', '现文件')
# 拷贝整个目录文件,ignore参数为不需要拷贝的文件类型
shutil.copytree("原目录", "新目录", ignore=shutil.ignore_patterns("*.pyc", ".mp4"))
# 删除目录,ignore_errors为是否忽略错误
shutil.rmtree("temp", ignore_errors=True)
# 移动文件/目录
shutil.move("temp", "/core/temp_bak", copy_function=shutil.copy2)
# 获取磁盘使用空间 如果传.则表示当前磁盘
total, used, free = shutil.disk_usage("c:")
print("当前磁盘共: %iGB, 已使用: %iGB, 剩余: %iGB"%(total / 1073741824, used / 1073741824, free / 1073741824))
# 当前磁盘共: 233GB, 已使用: 90GB, 剩余: 143GB
# 压缩文件
shutil.make_archive('压缩文件夹的名字', 'zip','待压缩的文件夹路径')
shutil.make_archive('logging2', 'zip','/Users/jingliyang/PycharmProjects/面试题/常用模块/随机数')
# 解压文件 如果不写目录默认解压到当前目录
shutil.unpack_archive('zip文件的路径.zip','解压到目的文件夹路径')
shutil.unpack_archive('/Users/jingliyang/PycharmProjects/面试题/常用模块/shutil模块/logging2.zip','/Users/jingliyang/PycharmProjects/面试题/常用模块/shutil模块/tmp')
import logging
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
# CRITICAL > ERROR > WARNING > INFO > DEBUG
import logging
# 同时向文件和屏幕上输出
fh = logging.FileHandler('tmp.log', encoding='utf-8') # 文件操作符
sh = logging.StreamHandler() # 屏幕输出操作符
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s[line :%(lineno)d]-%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
level=logging.DEBUG,
handlers=[fh, sh] # 操作符
)
logging.debug('debug 信息错误 test2')
logging.info('warning 信息错误 test2')
logging.warning('warning message test2')
logging.error('error message test2')
logging.critical('critical message test2')
# 做日志的切分
import logging
from logging import handlers
sh = logging.StreamHandler()
rh = handlers.RotatingFileHandler('myapp.log', maxBytes=1024,
backupCount=5) # 按照大小做切割 backupCount表示切几次文件,当达到最大值再次切割文件时候会将第一次产生的文件删除
fh = handlers.TimedRotatingFileHandler(filename='x2.log', when='s', interval=5,
encoding='utf-8') # 按照时间做切割 when参数接收时间单位 interval参数接收时间间隔大小 每次切割后面以时间做结尾区分 x2.log.2020-06-23-33
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s[line :%(lineno)d]-%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
level=logging.DEBUG,
# handlers=[fh,sh,fh2]
handlers=[fh, rh, sh]
)