python语法 模块篇

模块一系列功能的集合体

把文件夹作为模块使用,文件夹里面必须要有__init__.py

1.模块的导入

import module

从xx中导入xxxx

from xx import xxxx

把xx中的所有名字导入

from xx import *

可以通过as,简洁导入模块名称

import xx as x

2. __name__

创建一个module.py文件

name='Module'
def func1():
    print('func1')


def func2():
    global name
    name='Module2'
    print('func2')

if __name__ == '__main__':
    print('module模块被执行')
    func1()
    func2()
else:
    print("module模块被导入")

此时运行module.py结果如下:
image

再在其他文件中导入module.py文件

import module as m
print(m.__name__)
print(m.name)
m.func2()
print(m.name)

结果如下:
image
说明:
如果模块是直接被执行的:name 的值为 'main'
如果模块是被导入到其他模块中的:name 的值为模块的名称

3.模块的查找顺序

  1. 内存
  2. 硬盘
    从sys.path中找
    image

4.time模块

import time
#1.时间戳
t=time.time()

#2.格式化字符串形式:
print(time.strftime('%Y-%m-%d %H:%M:%S %A'))
print(time.strftime('%Y-%m-%d %X %A'))
print(time.strftime('%x %X %A'))

#结构化时间

res=time.localtime()
print(res)
print(res.tm_year)
print(res.tm_mon)



image

image

import time
import datetime

res = datetime.datetime.now() + datetime.timedelta(days=25)
print(res.replace(microsecond=0))

#时间戳 ----> 结构化时间 ----> 格式化的字符串时间
#时间戳 <---- 结构化时间 <---- 格式化的字符串时间
res = time.time()
print(time.localtime(11111111))
print(time.gmtime(11111111))
print(time.gmtime())

res=time.localtime(111111111)
print(time.strftime('%Y-%m-%d %X'),res)

5.random 模块

import random
print(random.random())
print(random.uniform(1,10))
print(random.randint(1,10))
print(random.randrange(1,3))

image

image


#生成16位的随机字符串
def pwd_generator(length=16):
    pwd=''
    char_list=[[97,122],[65,90],[48,57],[33,47]]
    for _ in range(16):
        random_list=random.choice(char_list)
        random_char=chr(random.randint(*random_list))
        pwd+=random_char
    return pwd

print(pwd_generator())

image

6.OS 模块

import os 
print(os.getcwd()) # 获取当前工作目录
print(os.listdir()) # 获取指定目录文件下所有文件和文件夹,包括隐藏文件、并返回目录
os.remove() #删除文件

  • 获取系统的环境变量
import os
print(os.environ)
for i in os.environ:
    print(i)

7.序列化与反序列化

序列化把内存中的数据类型转化成一种特定格式,这种特定格式可以用于存储或传输给其他平台

内存中的数据类型 ---> 序列化 ---> 特定格式(json/pickle)

内存中的数据类型 <--- 反序列化 <--- 特定格式(json/pickle)

用途:

  1. 存档
  2. 跨平台数据交互(只能用json,pickle是Python专用格式)

8.json模块

import json
import ujson
#猴子补丁
def monkey_patch_json():
    json.__name__='ujson'
    json.dumps=ujson.dumps
    json.loads=ujson.loads
monkey_patch_json()
#序列化
dic ={'name':'张大仙','age':18,'salary':3.5}
json_res=json.dumps(dic,ensure_ascii=False)
print(json_res,type(json_res))

with open(r"D:\Pycharm workplace\python全栈学习\data\test.json",mode='wt',encoding='utf-8') as f:
    f.write(json_res)


#反序列化
with open(r"D:\Pycharm workplace\python全栈学习\data\test.json",mode='rt',encoding='utf-8') as f:
    json_res=f.read()
dic=json.loads(json_res)
print(dic,type(dic))

image

下面是test.json文件内容

{"name":"张大仙","age":18,"salary":3.5}

9.logging模块

import logging

logging.debug('调试日志')
logging.info('消息日志')
logging.warning('警告日志')
logging.error('错误日志')
logging.critical('严重错误日志')

image

10.日志配置

# coding:utf-8
import logging

# 日志基本配置
logging.basicConfig(
    # 1、日志级别
    level=30,
    # DEBUG:10
    # INFO:20
    # WARNING:30
    # ERROR:40
    # CRITICAL:50

    # 2、日志输出格式
    # format='%(asctime)s %(name)s [%(pathname)s line:%(lineno)d] %(levelname)s %(message)s',

    # 3、asctime的时间格式
    # datefmt='%Y-%m-%d %H:%M:%S',

    # 4、日志输出位置:终端/文件
    # filename='user.log',  # 不指定此配置,默认打印到终端
)


'''
%(name)s		Logger的名字(getlogger时指定的名字)
%(levelno)s	数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s	调用日志输出日志的完整路径名
%(filename)s	调用日志输出日志的文件名
%(module)s	调用日志输出日志的模块名
%(funcName)s	调用日志输出日志的函数名
%(lineno)d	调用日志输出函数的语句所在的代码行
%(created)f	当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d	输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s	字符串形式的当前时间,默认格式是 “2022-07-30 22:15:53,394”
%(thread)d	线程ID,可能没有
%(threadName)s	线程名,可能没有
%(process)d	进程ID,可能没有
%(message)s	用户输出的消息
'''



'''
logging模块有三个比较重要的功能组件:
    1、loggers 配置文件可定义一些输出日志的appname
    2、handler 配置日志的分隔大小,输出位置,日志文件创建等
    3、formatters 配置日志输出的格式
'''
# 日志配置字典
LOGGING_DIC = {
    'version': 1.0,
    'disable_existing_loggers': False,
    # 日志格式
    'formatters': {
        'standard': {
            'format': '%(asctime)s %(threadName)s:%(thread)d [%(name)s] %(levelname)s [%(pathname)s:%(lineno)d] %(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S',
        },
        'simple': {
            'format': '%(asctime)s [%(name)s] %(levelname)s  %(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S',
        },
        'test': {
            'format': '%(asctime)s %(message)s',
        },
    },
    'filters': {},
    # 日志处理器
    'handlers': {
        'console_debug_handler': {
            'level': 'DEBUG',  # 日志处理的级别限制
            'class': 'logging.StreamHandler',  # 输出到终端
            'formatter': 'simple'  # 日志格式
        },
        'file_info_handler': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,日志轮转
            'filename': 'user.log',
            'maxBytes': 1024*1024*10,  # 日志大小 10M
            'backupCount': 10,  # 日志文件保存数量限制
            'encoding': 'utf-8',
            'formatter': 'standard',
        },
        'file_debug_handler': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',  # 保存到文件
            'filename': 'test.log',	 # 日志存放的路径
            'encoding': 'utf-8',	# 日志文件的编码
            'formatter': 'test',
        },
    },
    # 日志记录器
    'loggers': {
        'logger1': {  # 导入时logging.getLogger时使用的app_name
            'handlers': ['console_debug_handler'],  # 日志分配到哪个handlers中
            'level': 'DEBUG',  # 日志记录的级别限制
            'propagate': False,  # 默认为True,向上(更高级别的logger)传递,设置为False即可,否则会一份日志向上层层传递
        },
        'logger2': {
            'handlers': ['console_debug_handler', 'file_debug_handler'],
            'level': 'INFO',
            'propagate': False,
        },
    }
}

# 注:进行日志轮转的日志文件,不能和其他handler共用,不然会导致文件被占用无法更名而报错!
posted @ 2025-07-09 21:06  屈臣  阅读(17)  评论(0)    收藏  举报