目录
功能:与操作系统交互,可以操作文件
os.path.isfile(r'路径')
os.path.isdir()判断是否为文件夹
os.mkdir('m2')创建一个文件夹名为m2的文件夹
if not os.path.exists(r'路径'):#检测路径下文件夹是否存在,如果不存在,就创建文件夹
os.mkdir(r'路径')
os.listdir(r'地址')列出地址下的所有文件及文件夹(*****)
os.rmdir('m2')将名为m2的文件夹删除
os.getcwd()获取当前文件所在文件夹的路径,
os.rename('name1','name2')重命名为name2
__file__只有pycharm里面有,
res = os.path.join('路径1','路径2')自动拼接路径,支持不同平台的路径拼接,(windows、ios、andirod、linux、unix) 可以多层路径拼接,且拼接过程中自动加'\'
os.path.abspath(_file_)获取当前文件的绝对路径,根据不同的操作系统自动更换斜杠
os.path.dirname和abspath联用获取上层文件夹的路径。
os.walk返回三个路径
os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下。
os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。
在Unix,Windows中有效。
walk()方法语法格式如下:
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
参数:
返回值:
该方法没有返回值。
功能:与python解释器交互
sys.argv最常用,当使用命令行式运行文件,接收多余的参数,通过列表的形式接收,第一个元素是程序本身的路径。
sys.path返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.modules.key()返回所有已经导入的模块列表
把对象(变量)从内存中变成可存储或传输的过程称之为序列化
序列化的优点:
json序列化并不是python独有的,json序列化在java等语言中也会涉及,因此使用json序列化能够达到跨平台数据传输的目的。
# # 序列化字典为json串,并保存文件
import json
def dic():
print('func')
with open('test.json', 'w', encoding='utf8') as fw:
json.dump(dic, fw)
# 反序列化
with open('test.json', 'r', encoding='utf8') as fr:
data = json.load(fr)
print(type(data), data)
json数据类型和Python数据类型的对应关系表
json类型 | python类型 |
---|---|
{} | dict |
[] | list |
"string" | str |
520.13 | int或float |
true/false | True/False |
null | None |
从python的字典(最常用)变成json串,
反序列化,从json文本变成python文本。
json.dump()序列化到文件中
json.load()从硬盘中获取json串
json.dumps()序列化到内存中
json.loads()从内存中获取json串
pickle的功能也是序列化和反序列化,但它的缺点是只能用于python,并且只能用pickle保存不重要的数据,即不能成功的反序列化也没关系,它的优点是可以存python中所有的数据类型包括对象。
功能:生成日志模块
日志级别(如不设置,默认显示30以上)
#V1 日志级别(如果不设置,默认显示30以上)
# logging.info('info') # 10
# logging.debug('debug') # 20
# logging.warning('wraning') # 30
# logging.error('error') # 40
# logging.critical('critical') # 50
V2 添加设置
# logging.basicConfig(filename='20190927.log',
# format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
# datefmt='%Y-%m-%d %H:%M:%S %p',
# level=10)
#上面模板copy过来然后配置level
# username = 'nick'
# goods = 'bianxingjingang'
# logging.info(f'{username}购物{goods}成功') # 10
V3自定义配置
# 1. 配置logger对象
nick_logger = logging.Logger('nick')
json_logger = logging.Logger('jason')
# 2. 配置格式
formmater1 = logging.Formatter('%(asctime)s - %(name)s -%(thread)d - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p ', )
formmater2 = logging.Formatter('%(asctime)s : %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p', )
formmater3 = logging.Formatter('%(name)s %(message)s', )
# 3. 配置handler --> 往文件打印or往终端打印
h1 = logging.FileHandler('nick.log')
h2 = logging.FileHandler('json.log')
sm = logging.StreamHandler()
# 4. 给handler配置格式
h1.setFormatter(formmater1)
h2.setFormatter(formmater2)
sm.setFormatter(formmater3)
# 5. 把handler绑定给logger对象
nick_logger.addHandler(h1)
nick_logger.addHandler(sm)
json_logger.addHandler(h2)
# 6. 直接使用
nick_logger.info(f'nick 购买 变形金刚 4个')
# json_logger.info(f'json 购买 变形金刚 10个')
logging模块包含四种角色:logger、Filter、Formatter对象、Handler
#以上可以全部忘记,只要会下面的配置方法
import os
import logging.config
# 定义三种日志输出格式 开始
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' # 其中name为getLogger()指定的名字;lineno为调用日志输出函数的语句所在的代码行
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
# 定义日志输出格式 结束
logfile_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # log文件的目录,需要自定义文件路径 # atm
logfile_dir = os.path.join(logfile_dir, 'log') # C:\Users\oldboy\Desktop\atm\log
logfile_name = 'log.log' # log文件名,需要自定义路径名
# 如果不存在定义的日志目录就创建一个
if not os.path.isdir(logfile_dir): # C:\Users\oldboy\Desktop\atm\log
os.mkdir(logfile_dir)
# log文件的全路径
logfile_path = os.path.join(logfile_dir, logfile_name) # C:\Users\oldboy\Desktop\atm\log\log.log
if os.path.getsize(logfile_path) > 4000:
pass
# 定义日志路径 结束
# log配置字典 (不能改)
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
# 配日志格式
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {}, # filter可以不定义
# 配置打印位置
'handlers': {
# 打印到终端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
# 打印到文件的日志,收集info及以上的日志
'default': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': logfile_path, # 日志文件
'maxBytes': 1024 * 1024 * 5, # 日志大小 5M (*****)
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
# logging.getLogger(__name__)拿到的logger配置。如果''设置为固定值logger1,则下次导入必须设置成logging.getLogger('logger1')
'': {
# 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'handlers': ['default', 'console'],
'level': 'DEBUG',
'propagate': False, # 向上(更高level的logger)传递
},
},
}
def load_my_logging_cfg():
logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置
logger = logging.getLogger(__name__) # 生成一个log实例
logger.info('It works!') # 记录该文件的运行状态
return logger
if __name__ == '__main__':#此处是自己加的
load_my_logging_cfg()