os模块,sys模块,json / pickle模块,logging模块

目录

OS模块

能与操作系统交互,控制文件 / 文件夹

# 创建文件夹import osos.mkdir(r'D:\py_case\test')# 删除文件夹os.rmdir(r'D:\py_case\test')# # 列出指定目录下所有文件和子目录 (子目录文件不会列出来)res = os.listdir(r'D:\pycharm_project\Test')print(res)# 打印结果:['.idea', 'ex16.py', 'test.json', 'test.pkl', 'test.py']# 列出当前文件所在的文件夹res = os.getcwd()print(res)# 打印结果: D:\pycharm_project\Test# 列出当前文件所在的具体路径# __file__ pycharm独有的res = os.path.abspath(__file__) # 根据不同的操作系统更换不同的/或print(res) # D:\pycharm_project\Test\test.py# 文件的文件夹res = os.path.dirname(os.path.abspath(__file__))print(res) # D:\pycharm_project\Testres = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))print(res) # D:\pycharm_project# 拼接文件路径res = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'img', 'test.jpg')print(res) # D:\pycharm_project\Test\img\test.jpg# 判断路径是否存在(文件 / 文件夹都适用)res = os.path.exists(r'D:\pycharm_project\Test\ex16.py')print(res) # True# 判断是否为文件res = os.path.isfile(r'D:\pycharm_project\Test\aaa')print(res) # False# 删除文件os.remove('test.txt')# 重命名文件os.rename('test.txt', 'test2.txt')# 判断是否为文件夹res = os.path.isdir(r'D:\pycharm_project\Test\aaa')print(res) #True# 与终端交互,输入命令res = os.system('dir')print(res)
res = os.walk(r'D:\pycharm_project\Test\aaa')print(res) # <generator object walk at 0x0000027DB46916D8>res = os.walk(r'D:\pycharm_project\Test')# print(res)for dir, _, files in res: # print(i) # 所有文件夹名 # print(l) # 某个文件下对应的所有文件名 for file in files: file_path = os.path.join(dir,file) # 拼接成所有文件名 if file_path.endswith('py'): # 拿到py文件 print(file_path) # 打印结果:'''D:\pycharm_project\Test\ex16.pyD:\pycharm_project\Test\test.pyD:\pycharm_project\Test\aaa\12.py'''
方法详解
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.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所指向的文件或者目录的最后修改时间
os.path.getsize(path)返回path的大小

sys模块

与python解释器交互

import sys## 最常用,当使用命令行式运行文件,接收多余的参数res = sys.argvprint(res)

方法详解
sys.argv命令行参数List,第一个元素是程序本身路径
sys.modules.keys()返回所有已经导入的模块列表
sys.exc_info()获取当前正在处理的异常类,exc_type、exc_value、exc_traceback当前处理的异常详细信息
sys.exit(n)退出程序,正常退出时exit(0)
sys.hexversion获取Python解释程序的版本值,16进制格式如:0x020403F0
sys.version获取Python解释程序的版本信息
sys.maxint最大的Int值
sys.maxunicode最大的Unicode值
sys.modules返回系统导入的模块字段,key是模块名,value是模块
sys.path返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform返回操作系统平台名称
sys.stdout标准输出
sys.stdin标准输入
sys.stderr错误输出
sys.exc_clear()用来清除当前线程所出现的当前的或最近的错误信息
sys.exec_prefix返回平台独立的python文件安装的位置
sys.byteorder本地字节规则的指示器,big-endian平台的值是‘big‘,little-endian平台的值是‘little‘
sys.copyright记录python版权相关的东西
sys.api_version解释器的C的API版本

json和pickle模块

序列化和反序列化

  • 序列化:按照特定的规则排列,把python数据类型转化为json串,便于跨平台传输
  • 反序列化:把json串转化为python / java / c / php 需要的语言

Json序列化并不是python独有的,json序列化在java等语言中也会涉及到,因此使用json序列化能够达到跨平台传输数据的目的。

json数据类型和python数据类型对应关系表

Json类型Python类型
{}dict
[]list
"string"str
520.13int或float
true/falseTrue/False
nullNone

json模块

dic = {'a': 1, 'b': 2, 'c': None}data = json.dumps(dic) # json串中没有单引号print(type(data), data)data = json.loads(data)print(type(data), data)# 打印结果:'''<class 'str'> {"a": 1, "b": 2, "c": null}<class 'dict'> {'a': 1, 'b': 2, 'c': None}'''
dic = {'a': 1, 'b': 2, 'c': None}# 序列化字典为json串,并保存文件with open('test.json', 'w', encoding='utf-8') as fw: json.dump(dic, fw) # 反序列化with open(f'{"test"}.json', 'r', encoding='utf-8') as fr: data = json.load(fr) print(type(data), data) # <class 'dict'> {'a': 1, 'b': 2, 'c': None}

pickle

Pickle序列化和所有其他编程语言特有的序列化问题一样,它只能用于Python。但是pickle的好处是可以存储Python中的所有的数据类型,包括对象,而json不可以。

import picklese = {1, 3, 4, 5, 6}with open('test.pkl', 'wb') as fw: pickle.dump(se, fw)
se = {1, 3, 4, 5, 6}def func(): x = 3 def wrapper(): print(x) return wrapperwith open('test.pkl', 'wb') as fw: pickle.dump(func, fw)with open('test.pkl', 'rb') as fr: data = pickle.load(fr) # print(data) res = data() res()

logging模块

v1:

import logging# 日志级别(如果不设置,默认显示30以上)logging.info('info') # 10logging.debug('debug') # 20logging.warning('warning') # 30logging.error('error') # 40logging.critical('critical') # 50# 打印结果:'''WARNING:root:warningERROR:root:errorCRITICAL:root:critical'''

v2:

import logging# 日志的基本配置logging.basicConfig(filename='access.log', format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', level=10) # level是等级,10以上的都记录日志logging.info('正常信息') # 10logging.debug('调试信息') # 20logging.warning('警告信息') # 30logging.error('报错信息') # 40logging.critical('严重错误信息') # 50# 会创建一个access.log日志:'''2019-09-27 21:57:45 PM - root - DEBUG -test: 调试信息2019-09-27 21:57:45 PM - root - INFO -test: 正常信息2019-09-27 21:57:45 PM - root - WARNING -test: 警告信息2019-09-27 21:57:45 PM - root - ERROR -test: 报错信息2019-09-27 21:57:45 PM - root - CRITICAL -test: 严重错误信息'''

v3: 自定义配置

import logging# 1. 配置logger对象cwz_logger = logging.Logger('cwz')neo_logger = logging.Logger('neo')# 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('cwz.log')h2 = logging.FileHandler('neo.log')sm = logging.StreamHandler()# 4. 给handler配置格式h1.setFormatter(formmater1)h2.setFormatter(formmater2)sm.setFormatter(formmater3)# 5. 把handler绑定给logger对象cwz_logger.addHandler(h1)cwz_logger.addHandler(sm)neo_logger.addHandler(h2)# 6. 直接使用cwz_logger.info(f'cwz 购买 变形金刚 8个')

相关文章