Python-常用模块(1)
OS模块
os
模块干什么用?
与操作系统交互,控制操作系统文件/文件夹
方法 | 描述 |
---|---|
os.path.isfile() | 判断是否为文件 |
os.remove("") | 删除文件 |
os.rename("","") | 重命名文件 |
os.path.exists() | 判断是否为文件夹 |
os.mkdir("test") | 创建文件夹 |
os.rmdir("test") | 删除文件夹 |
os.listdir() | 列出来文件夹内所有文件 |
os.getcwd() | 获取当前文件所在文件夹 |
os.path.abspath(file) | 获取当前文件所在具体路径(绝对路径) |
os.path.dirname(os.path.abspath(file)) | 获取当前执行文件的文件夹 |
os.path.join(os.path.dirname(os.path.abspath(file)),"test.log") | 拼接文件绝对路径 |
os.walk("文件夹") | 遍历文件夹下所有文件 |
os.system("dir") | 伪终端,执行命令 |
import os
'''
对文件操作
'''
# 1. 判断是否为文件
print(os.path.isfile(r"C:\Users\Administrator\Desktop\python\python程序编写\正式班\day 16\01 os模块.py"))
# True
# 2. 删除文件
# os.remove("")
# 3. 重命名文件
# os.rename("","")
'''
对文件夹操作
'''
# 1. 判断是否为文件夹
print(os.path.exists(r"C:\Users\Administrator\Desktop\python\python程序编写\正式班\day 16\练习"))
# True
# 2. 创建文件夹
# os.mkdir("test")
# 3. 删除文件夹
# os.rmdir("test")
# 4. 列出来文件夹内所有文件
print(os.listdir(r"C:\Users\Administrator\Desktop\python\python程序编写\正式班\day 16\练习"))
# ['count_lines.py', 'json许序列化对象.json', 'os模块.py', 'Pickle许雷华对象.pkl', 't1.log', 't2.log', 'test.py', '模块的使用.py']
# 5. 获取当前文件所在文件夹
print(os.getcwd())
# C:\Users\Administrator\Desktop\python\python程序编写\正式班\day 16\练习
# 6. 获取文件所在具体路径(绝对路径)
print('__file__:', __file__)
print(os.path.abspath(__file__))
# C:\Users\Administrator\Desktop\python\python程序编写\正式班\day 16\练习\os模块.py
# 7. 获取文件的文件夹
print(os.path.dirname(os.path.abspath(__file__)))
# C:\Users\Administrator\Desktop\python\python程序编写\正式班\day 16\练习
# 8. 拼接文件路径
print(os.path.join(os.path.dirname(os.path.abspath(__file__)),"test.log"))
# C:\Users\Administrator\Desktop\python\python程序编写\正式班\day 16\练习\test.log
# 9. 判断路径是否存在(文件or文件夹都适用)
print(os.path.exists(r"C:\Users\Administrator\Desktop\python\python程序编写\正式班\day 16\练习\count_lines.py"))
# True
print(os.path.exists(r"C:\Users\Administrator\Desktop\python\python程序编写\正式班\day 16\练习"))
# True
# 终端代码
print(os.system("dir"))
# 打印当前所有文件。
sys模块
sys 模块与python解释器交互
'''
sys模块
与python解释器交互
'''
import sys
# 最常用的就是argv方法,接收命令行参数
print(sys.argv[1])
# 当使用命令行式运行文件,接收多余的参数
json与pickle序列化
方法 | 描述 |
---|---|
dumps | 在内存中转换成json串/pickle |
dump | 保存到硬盘json串/pickle |
loads | 在内存中转换成python数据类型 |
load | 从硬盘中转换成python数据类型 |
# json 模块(序列化)
# json模块: 跨平台数据交互,json串
import json
'''
json 序列化
'''
struct_data = {"name": "json", "age": 23, "sex": "male"}
print(struct_data)
# 将python数据类型转换为json,json格式括号内都是双引号
data = json.dumps(struct_data)
print(data,type(data))
# {"name": "json", "age": 23, "sex": "male"} <class 'str'>
'''
{
"name":"json",
"age":23,
"sex":"male"
}
'''
# 将json格式加载为python数据类型
data = json.loads(data)
print(data,type(data))
# {'name': 'json', 'age': 23, 'sex': 'male'} <class 'dict'>
a = {"name":123} # python中双引号的字典类型也是json格式
print(a,type(a)) # 注意:python执行程序的时候会把字典中双引号编程单引号,为了和json数据类型区分
'''
{
"name":123
}
'''
# 序列化
with open("json许序列化对象.json","w") as fw:
json.dump(struct_data,fw)
# 反序列化
with open("json许序列化对象.json","r") as fr:
data = json.load(fr)
print(data,type(data))
# {'name': 'json', 'age': 23, 'sex': 'male'} <class 'dict'>
# pickle 模块(序列化)
# pickle模块: 不跨平台,针对python所有数据类型,如集合,使用方式和json一模一样
'''
pickle 序列化
'''
import pickle
print("#--" * 50)
struct_data = {'name': 'json', 'age': 23, 'sex': 'male'}
print(struct_data,type(struct_data))
data = pickle.dumps(struct_data)
print(data,type(data)) # 二进制
# b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00jsonq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x03\x00\x00\x00sexq\x04X\x04\x00\x00\x00maleq\x05u.' <class 'bytes'>
data = pickle.loads(data)
print(data,type(data))
# {'name': 'json', 'age': 23, 'sex': 'male'} <class 'dict'>
# pickle 序列化,需要二进制存储
with open("Pickle序列化对象.pkl","wb") as fw:
pickle.dump(struct_data,fw)
# 反 pickle 序列化
with open("Pickle序列化对象.pkl","rb") as fr:
data = pickle.load(fr)
print(data,type(data))
# {'name': 'json', 'age': 23, 'sex': 'male'} <class 'dict'>
log模块
话不多说,直接上模板
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
# 定义日志路径 结束
# 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()
使用方法如下:
import time
import logging
import my_logging # 导入自定义的logging配置
logger = logging.getLogger(__name__) # 生成logger实例
def demo():
logger.debug("start range... time:{}".format(time.time()))
logger.info("中文测试开始。。。")
for i in range(10):
logger.debug("i:{}".format(i))
time.sleep(0.2)
else:
logger.debug("over range... time:{}".format(time.time()))
logger.info("中文测试结束。。。")
if __name__ == "__main__":
my_logging.load_my_logging_cfg() # 在你程序文件的入口加载自定义logging配置
demo()