python常用标准库
标准库之os
- 系统相关变量和操作
- 文件和目录相关操作
- 执行命令和管理进程
import os
# 1.系统相关的内容
print(os.name)
print(os.environ) # 环境变量
print(os.sep) # 查看分隔符
print(os.pathsep) # windows是;号 Linux是:号
print(os.linesep) # 文件换行符
# 2.文件和目录操作
os.mkdir('demo')
os.mkdir('demo')
os.getcwd() # 当前目录
os.remove() # 文件删除
# 子模块os.path
file = os.getcwd() + 'test.py'
print(os.path.split(file))
print(os.path.isabs(file)) # 判断绝对路径
# isdir isfile
print(os.path.exists(file)) # 判断文件或者路径是否存在
print(os.path.getatime(file)) # 最后访问时间
print(os.path.getctime(file)) # 创建时间
print(os.path.getmtime(file)) # 最后修改时间
print(os.path.getsize(file)) # 获取文件大小
# 3.执行命令和管理进程
os.system # 交互性不强,只有执行结果
os.popen # 已不推荐使用os.system和popen
os.popen('helloworld.py')
os.system('ipconfig')
标准库之sys
import sys
print(sys.version) # 版本号
print(sys.maxsize) # 能够表示的最大int
print(sys.path)
print(sys.platform)
print(sys.copyright)
print(sys.argv) # 参数
sys.exit(0) # 退出 状态码
print(sys.getdefaultencoding())
print(sys.getfilesystemencoding())
print(sys.getrecursionlimit()) # 最大递归数量
sys.setrecursionlimit(200)
标准库之random
主要用于生成“伪随机数”
import random
# 生成随机的整数
print(random.randint(1, 100))
print(random.randrange(1, 101, 2)) # 生成随机奇数或者偶数
# 生成随机的浮点数
print(random.random()) # 浮点数在0.0-1.0之间
print(random.uniform(11.1, 13.1)) # 生成区间之内的浮点数
# 非数字类型的随机抽样
targetList = ['a', 'b', 'c', 'd', 'e', 'f']
print(random.choice(targetList)) # 从指定list中随机抽样1个
# 乱序
print(targetList)
print(random.shuffle(targetList)) # 原地改变
print(targetList)
print(random.sample(targetList, 4)) # 抽样,但不改变原样本
# 生成随机密码
# 字符只包括字母和数字
# 可以指定生成字符串的位数
import random, string
def gen_random_string(length):
# 随机生成字母和数字的位数
# 1<= numcount <= length-1
numcount = random.randint(1, length-1)
lettercount = length - numcount
# 随机抽样生成数字序列
numlist = [random.choice(string.digits) for _ in range(numcount)]
# 随机抽样生成字符序列
letterlist = [random.choice(string.ascii_letters) for _ in range(lettercount)]
#合并字母和数字
alllist = numlist + letterlist
# 乱序
random.shuffle(alllist)
# 生成目标结果字符串
result = "".join(alllist)
return result
randString = gen_random_string(10)
print(randString)
标准库之time
# 时间戳、结构化时间对象、格式化时间字符串
# 时间戳
print(time.time())
print(time.time() - 3600)
# 结构化时间对象
st = time.localtime()
print(st, type(st))
print("今天是 {}-{:02d}-{}".format(st[0], st[1], st[2]))
print("今天是 星期{}".format(st.tm_wday + 1))
# 格式化时间字符串
print(time.ctime())
#
print(time.strftime("%Y-%m-%d %H:%M:%S"))
time.sleep(1)
标准库之datetime
在time标准库上进一步分装
datetime.date
datetime.time
datetime.datetime
datetime.timedelta
import datetime
import time
# datetime.date
# 生成日期
d = datetime.date.today()
print(d, type(d))
d = datetime.date(2022, 4, 12)
print(d, type(d))
d= datetime.date.fromtimestamp(time.time())
print(d, type(d))
# 类属性
print(datetime.date.min)
print(datetime.date.max)
print(datetime.date.resolution) # timedelta
# 实例属性
print(d.year)
print(d.month)
print(d.day)
# 常用的实例方法
# datetime.data对象 -> 结构化时间对象
print(d.timetuple())
# 其他方法
# replace
print(d.replace(2022))
print(d.replace(d.year, 9))
print(d.replace(day=20))
print(d.replace(d.year, d.month, 20))
print(d.toordinal()) # 从0001-01-01到现在的天数
print(d.weekday()) # 0代表周一
print(d.isoweekday()) # 1代表周一
print(d.isoformat())
print(d.strftime("%Y-%m-%d"))
# datetime.time
print("{:=^50s}".format("datetime.date")) # 生成分割线
# 生成时间
t = datetime.time(15, 10, 45, 888888) # 时、分、秒、微秒
print(t, type(t))
# 类方法
print(datetime.time.min)
print(datetime.time.max)
print(datetime.time.resolution)
# 实例属性
print(t.hour)
print(t.minute)
print(t.second)
print(t.microsecond)
# 其他方法
print(t.isoformat())
print(t.strftime("%H-%M-%S %f"))
# datetime.datetime
# 生成日期时间
dt = datetime.datetime(2022, 4, 12, 20, 50, 30, 888888)
print(dt, type(dt))
dt = datetime.datetime.now()
print(dt, type(dt))
# 时间戳 -> dt
dt = datetime.datetime.fromtimestamp(time.time())
print(dt, type(dt))
# 字符串 -> dt
dt = datetime.datetime.strptime("2023-4-12 20:52:33", "%Y-%m-%d %H:%M:%S")
print(dt, type(dt))
# date,time -> datetime
dt = datetime.datetime.combine(d, t)
print(dt, type(dt))
# 实例属性
print(dt.year)
print(dt.month)
print(dt.day)
print(dt.hour)
print(dt.minute)
print(dt.second)
print(dt.microsecond)
# replace
print(dt.replace(second=57, day=20))
# datetime -> 结构化对象
print(dt.timetuple())
# datetime -> 时间戳
print(dt.timestamp())
# datetime -> 结构化字符串
print(dt.strftime("%Y-%m-%d %H:%M:%S"))
# 时间戳 -> datetime
print(datetime.datetime.fromtimestamp(time.time()))
# 格式化对象 -> datetime
print(datetime.datetime.strptime("2023-4-12 20:52:33", "%Y-%m-%d %H:%M:%S"))
# 结构化对象 -> datetime
print(datetime.datetime.fromtimestamp(time.mktime(time.localtime())))
# datatime.timedelta
# 生成时间差
td = datetime.timedelta(days=10, hours=5)
print(td, type(td))
td = datetime.timedelta(days=-5, hours=-8) #向前
print(td, type(td))
td = datetime.timedelta(weeks=2)
print(td, type(td))
# 计算目标日期
dt = datetime.datetime.today()
print("现在是 {}".format(dt.strftime("%Y-%m-%d %H:%M:%S")))
delta = datetime.timedelta(days=10)
target = dt + delta
print("十天后是 {}".format(target.strftime("%Y-%m-%d %H:%M:%S")))
标准库之logging
日志级别
默认的日志级别是warning
级别 | 级别数值 | 使用时机 |
---|---|---|
DEBUG | 10 | 详细信息,常用语调试。 |
INFO | 20 | 程序正常运行过程中产生的一些信息。 |
WARNING | 30 | 警告用户,虽然程序还在正常工作,但有可能发生错误。 |
ERROR | 40 | 由于更严重的问题,程序已不能执行一些功能了。 |
CRITICAL | 50 | 严重错误,程序已不能继续运行。 |
相关组件
名称 | 作用 |
---|---|
Loggers | 记录器,提供应用程序代码直接使用的接口 |
Handlers | 处理器,将记录器产生的日志发送至目的地 |
Filters | 过滤器,提供更好的粒度控制,决定哪些日志会被输出 |
Formatters | 格式化器,设置日志内容的组成结构和消息字段 |
Formatters格式
属性 | 格式 | 描述 |
---|---|---|
asctime | %(asctime)s | 日志产生的时间,默认格式为msecs2003-07-0816:49:45,896 |
msecs | %(msecs)d | 日志生成时间的亳秒部分 |
created | %(created)f | time.tme)生成的日志创建时间戳 |
message | %(message)s | 具体的日志信息 |
filename | %(filename)s | 生成日志的程序名 |
name | %(name)s | 日志调用者 |
funcname | %( funcname)s | 调用日志的函数名 |
levelname | %(levelname)s | 日志级別( DEBUG,INFO, WARNING, 'ERRORCRITICAL) |
levene | %( leveling)s | 日志级别对应的数值 |
lineno | %(lineno)d | 日志所针对的代码行号(如果可用的话) |
module | %( module)s | 生成日志的模块名 |
pathname | %( pathname)s | 生成日志的文件的完整路径 |
process | %( (process)d | 生成日志的进程D(如果可用) |
processname | (processname)s | 进程名(如果可用) |
thread | %(thread)d | 生成日志的线程D(如果可用) |
threadname | %( threadname)s | 线程名(如果可用) |
demo:
import logging
# 默认只显示warning及以上的日志信息
logging.basicConfig(filename='demo.log', filemode='w', level=logging.DEBUG)
logging.debug("This is debug log")
logging.info("This is info log")
logging.warning("This is warning log")
logging.error("This is error log")
logging.critical("This is critical log")
# 向日志输出变量
name = '张三'
age = 18
logging.debug("姓名 %s, 年龄 %d", name, age)
logging.debug("姓名 %s, 年龄 %d" % (name, age))
logging.debug("姓名 {}, 年龄 {}".format(name, age))
logging.debug(f"姓名 {name}, 年龄 {age}")
# 输出格式和添加一些公共信息
logging.basicConfig(format="%(asctime)s|%(message)s", level=logging.DEBUG)
name = '张三'
age = 18
logging.debug("姓名 %s, 年龄 %d", name, age)
logging.basicConfig(format="%(asctime)s|%(levelname)s|%(message)s", level=logging.DEBUG)
logging.basicConfig(format="%(asctime)s|%(levelname)s|%(message)s", datefmt="%Y-%m-%d %H:%M:%S", level=logging.DEBUG)
代码形式:
import logging
# 记录器
logger = logging.getLogger('applog') # 默认是root
logger.setLevel(logging.DEBUG) # 优先级最高
# print(logger, type(logger))
# 处理器handler
consoleHandler = logging.StreamHandler() # 默认往console上输出
consoleHandler.setLevel(logging.DEBUG)
# 文件handler
fileHandler = logging.FileHandler(filename='Demo.log') # 默认使用创建的logger的日志级别
fileHandler.setLevel(logging.INFO)
# formater格式 -是左对齐,s之前的数字是占位
formatter = logging.Formatter("%(asctime)s|%(levelname)-8s|%(filename)10s:%(lineno)4s|%(message)s")
# formatter2 格式可以有多个
# 组合在一起
# 给处理器设置格式
consoleHandler.setFormatter(formatter)
fileHandler.setFormatter(formatter)
# 记录器设置处理器
logger.addHandler(consoleHandler)
logger.addHandler(fileHandler)
# 定义一个过滤器
# 过滤指定Logger的日志
flt = logging.Filter("applog")
# logger.addFilter(flt)
fileHandler.addFilter(flt)
# 打印日志的代码
logger.debug("This is debug log")
logger.info("This is info log")
logger.warning("This is warning log")
logger.error("This is error log")
logger.critical("This is critical log")
配置文件形式:
#./logging.conf
#记录器:提供应用程序代码直接使用的接口
#设置记录器名称,root必须存在!!!
[loggers]
keys=root,applog
#处理器,将记录器产生的日志发送至目的地
#设置处理器类型
[handlers]
keys=fileHandler,consoleHandler
#格式化器,设置日志内容的组成结构和消息字段
#设置格式化器的种类
[formatters]
keys=simpleFormatter
#设置记录器root的级别与种类
[logger_root]
level=DEBUG
handlers=consoleHandler
#设置记录器applog的级别与种类
[logger_applog]
level=DEBUG
handlers=fileHandler,consoleHandler
#起个对外的名字
qualname=applog
#继承关系
propagate=0
#设置
[handler_consoleHandler]
class=StreamHandler
args=(sys.stdout,)
level=DEBUG
formatter=simpleFormatter
[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
#在午夜1点(3600s)开启下一个log文件,第四个参数0表示保留历史文件
args=('applog.log','midnight',3600,0)
level=DEBUG
formatter=simpleFormatter
[formatter_simpleFormatter]
format=%(asctime)s|%(levelname)8s|%(filename)s[:%(lineno)d]|%(message)s
#设置时间输出格式
datefmt=%Y-%m-%d %H:%M:%S
import logging
import logging.config
logging.config.fileConfig('logging.conf')
#使用字典就能从任意格式文件进行配置,字典是一种接口格式
# logging.config.dictConfig({"loggers":"root,applog"})
rootLogger = logging.getLogger('applog')
rootLogger.debug("This is root Logger, debug")
logger = logging.getLogger('cn.cccb.applog')
logger.debug("This is applog, debug")
try:
int(a)
except Exception as e:
# logger.error(e)
logger.exception(e)
标准库之json
json是轻量级的文本数据交换格式,独立于语言之外的。
json具有自我描述性,更容易理解。
json是字符串。
访问元素: employees[0].lastName="Jobs";
{
"employees":[
{"firstName":"John", "lastName":"Doe"},
{"firstName":"Anna", "lastName":"Smith"},
{"firstName":"Peter", "lastName":"Jones"}
]
}
- 使用json字符串生成Python对象(load);
- 由Python对象格式化称为json字符串(dump)。
数据类型转换
将数据从json转换到Python内置类型:
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number(int) | int |
number(real) | float |
true | True |
false | False |
null | None |
将数据从Python内置类型转换到json格式:
Python | JSON |
---|---|
dict | object |
list,tuple | array |
str | string |
int,float,int- & float-derived Enums | number |
True | true |
False | false |
None | null |
使用方法
方法 | 功能 |
---|---|
json.dump(obj,fp) | 将python数据类型转换并保存到json格式的文件内。 |
json.dumps(obj) | 将python数据类型转换json格式的字符串。 |
json.load(fp) | 从json格式的文件中读取数据并转换为python类型。 |
json.loads(s) | 从json格式的字符串转换为python类型。 |
import json
# 从python对象转换为json字符串
person = {"name":"Sniper", "age":39, "tel":["123456", "123789"], "isonly":True}
print(person, type(person))
# indent格式化缩进,sort_keys排序
jsonStr = json.dumps(person, indent=4, sort_keys=True)
print(jsonStr, type(jsonStr))
json.dump(person, open('data.json', 'w'), indent=4, sort_keys=True)
# 从json字符串转换为python对象
jsonstr = '{"name": "Sniper", "age": 39, "tel": ["123456", "123789"], "isonly": true}'
pythonObj = json.loads(jsonstr)
print(pythonObj, type(pythonObj)) # dict
s = '["A", 1, "age", {"f":true, "l":"Snipper"}]'
pythonObj = json.loads(s)
print(pythonObj, type(pythonObj)) # list
pythonObj = json.load(open("data.json", "r"))
print(pythonObj, type(pythonObj))