os模块,sys模块,json / pickle模块,logging模块
程序员文章站
2022-06-20 20:11:08
[TOC] OS模块 能与操作系统交互,控制文件 / 文件夹 | 方法 | 详解 | | : : | : : | | os.getcwd() | 获取当前工作目录,即当前python脚本工作的目录路径 | | os.chdir("dirname") | 改变当前脚本工作目录;相当于shell下cd ......
目录
os模块
能与操作系统交互,控制文件 / 文件夹
# 创建文件夹 import os os.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\test res = 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.py d:\pycharm_project\test\test.py d:\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.argv print(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.13 | int或float |
true/false | true/false |
null | none |
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 pickle se = {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 wrapper with 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') # 10 logging.debug('debug') # 20 logging.warning('warning') # 30 logging.error('error') # 40 logging.critical('critical') # 50 # 打印结果: ''' warning:root:warning error:root:error critical: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('正常信息') # 10 logging.debug('调试信息') # 20 logging.warning('警告信息') # 30 logging.error('报错信息') # 40 logging.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个')
上一篇: python爬有道翻译