【Python专项】进阶语法-日志分类与分析(2)

16.内置模块

python 复制代码
import os
import time
import random
...
# ctrl + 左键点击 --> 跳转至模块详情页

📝 代码总结

  • 核心知识点:内置标准库模块引入与源码探索
  • 实现逻辑:导入常用系统模块,利用 IDE 快捷键跳转查看底层实现代码
  • 关键语法import os/time/random
  • 功能作用:引导开发者探索 Python 标准库底层逻辑,培养阅读源码与理解内置机制的习惯

17.模块导入方式-1

python 复制代码
"""
import 导入基本语法:
    import 模块名称
    import 模块名称 as 别名 --> 简化后续操作
调用模块中的相关功能(函数)
    模块名称.函数名称()
    别名.函数名称()
"""
import os
import time as t

if not os.path.exists('./images'):
    os.mkdir('./images')
t.sleep(5)
print("目录已建立,程序执行结束!")

📝 代码总结

  • 核心知识点import 完整导入与别名机制
  • 实现逻辑 :导入完整模块或设置简化别名,通过 模块.方法() 前缀语法调用功能
  • 关键语法import moduleimport module as aliasalias.func()
  • 功能作用:演示标准模块引入方式,别名机制简化长模块名调用,提升代码简洁度

18.模块导入方式-2

python 复制代码
'''
除了使用import导入以外,我们在工作中也经常使用from导入模块
基本语法
    from 模块名称 import *  => 类似import 模块名称,导入这个模块的所有内容
    from 模块名称 import 函数名1, 函数名2, 函数名3  => 随用随取,用哪些功能就取出哪些功能
通过from导入的模块,调用语法
    函数名称()
    函数名1()
    函数名2()
    函数名3()
from方式导入的模块,在调用时,不需要添加模块的前缀,而是直接调用即可。
'''
from os import *
from random import randint

# 调用模块中的方法
if path.exists('images'):
    rmdir('images')

# 调用模块中的方法 => randint
print(randint(1, 9))

📝 代码总结

  • 核心知识点from ... import 精准导入机制
  • 实现逻辑:从模块中提取特定函数或全部内容,调用时省略模块前缀直接使用函数名
  • 关键语法from module import funcfrom module import *func()
  • 功能作用:提供按需导入方式,减少命名空间冗余,简化高频函数的调用语法

19.math数学模块

python 复制代码
# 数学计算 --> + - * / % **
n1 = 4
print(n1,n1 + n1,n1 - n1,n1 * n1,n1 / n1,n1 % n1,n1 ** 2)
print('#' * 10)
# 引入数学模块
import math
print(math.sqrt(9))     # sqrt  -> 开平方根
print(math.ceil(0.3))     # ceil  -> 向上取整(示例:0.3 -> 1)
print(math.floor(0.3))    # floor -> 向下取整(示例:0.3 -> 0)

📝 代码总结

  • 核心知识点 :基础幂运算与 math 模块数学函数
  • 实现逻辑 :使用内置 ** 运算符求幂;导入 math 模块调用平方根、向上/向下取整函数
  • 关键语法**from math import sqrt, ceil, floor
  • 功能作用:扩展基础算术能力,演示标准数学库在复杂数值计算中的直接应用

20.内置魔法变量__name__

这是 Python 的惯用写法__name__ 是 Python 模块的内置属性:

  • 当这个文件直接被 Python 执行 时,__name__ 等于 '__main__'
  • 当这个文件被别的模块导入import)时,__name__ 等于文件名,不会执行这里的代码
python 复制代码
# 把my_file.py当做一个配角,辅助主文件(主角)完成某些功能
import my_file
python 复制代码
# my_file.py
print(__name__)
print(type(__name__))

📝 代码总结

  • 核心知识点:模块依赖导入与执行上下文概念引入
  • 实现逻辑:导入辅助模块文件,为后续主程序入口机制与模块隔离做铺垫
  • 关键语法import my_file
  • 功能作用:演示文件间的依赖关系,引出 Python 文件作为模块被导入时的执行环境差异

21.自定义模块使用

python 复制代码
# 角色:主角(主文件、主程序)
# 1. 导入模块
# 导入模块只是把模块的功能导入进来,本质模块中的功能不能直接执行
# 第一种导入 import my_script
# 第二种导入 from my_script import sum_num, sub_num

# 2. 准备调用模块中的方法(还未调用)

# 3. 调用模块中的方法
# 针对第一种调用方式 print(my_script.sum_num(10, 20))
# 针对第二种调用方式 print(sum_num(10, 20))

📝 代码总结

  • 核心知识点:自定义模块的导入规范与调用语法对比
  • 实现逻辑:注释梳理两种导入方式及对应调用语法,明确"导入≠执行"的模块化原则
  • 关键语法import module / from module import func
  • 功能作用:建立模块化编程思维,区分导入阶段与执行阶段,规范跨文件功能引用方式

22.项目主程序入口文件

bash 复制代码
# my_script.py

# 角色 --> 配角(模块)
# 函数1 -> 求和
def sum_num(n1,n2):
    result = n1+n2
    return result
# 函数2 -> 求差
def sub_num(n1,n2):
    result = n1-n2
    return result

print("信不信你只能在我这个终端看见我这一行关于你所调用的文件。")

# 编写测试代码 --> 这个不会运行在主角中,仅供测试。
if __name__ == '__main__':
    n1 = 33
    n2 = 66
    print(sum_num(n1, n2))
    print(sub_num(n1, n2))
python 复制代码
# 导入项目需要使用的功能模块
import my_script

# 定义功能 => 函数
def main():
    print("项目正在启动!")

# 给项目定义一个入口程序,所有可执行代码都是从入口开始的
if __name__ == '__main__':
    main()

📝 代码总结

  • 核心知识点if __name__ == '__main__': 程序入口规范
  • 实现逻辑:导入模块后定义启动函数,通过魔术变量判断当前文件是否为主运行文件,决定是否执行入口逻辑
  • 关键语法if __name__ == '__main__':
  • 功能作用:规范项目执行起点,防止模块被导入时意外执行测试代码,符合 Python 工程最佳实践

23.datetime模块strptime使用

python 复制代码
# 1. 导入模块
from datetime import datetime

# 2. 定义一个时间字符串
str1 = '09/May/2025:15:04:51'

# 3. 把以上时间格式更改为时间对象(字符串格式化,必须先转时间对象,时间对象里面的方法才能格式化)
dt = datetime.strptime(str1, '%d/%b/%Y:%H:%M:%S')

# 4. 打印dt时间对象
print(dt)

# 5. 判断dt是否为字符串?
print(type(dt))  # datetime时间对象,支持格式化为任意时间格式、支持时间范围比较

📝 代码总结

  • 核心知识点datetime.strptime 字符串转时间对象
  • 实现逻辑 :导入模块,定义非标准时间字符串,按格式模板解析为 datetime 对象
  • 关键语法datetime.strptime(str, format)
  • 功能作用:实现日志/文本时间到 Python 时间对象的转换,为后续时间计算与比较奠定基础

24.datetime模块strftime使用

python 复制代码
from datetime import datetime
str1 = '04/May/2026:17:53:50'
print(str1,type(str1),"时间字符串")
dt = datetime.strptime(str1, '%d/%b/%Y:%H:%M:%S')
print(dt, type(dt),"时间字符串 --> 时间对象 (字符串格式化)")
new_time = datetime.strftime(dt, '%Y/%m/%d %H:%M:%S')
print(new_time,type(new_time),"时间对象 --格式化--> 字符串 (主要用于显示数据,不能进行范围比较)")

📝 代码总结

  • 核心知识点datetime.strftime 时间对象转字符串
  • 实现逻辑 :将已解析的 datetime 对象按新格式模板重新序列化为标准字符串
  • 关键语法datetime.strftime(dt, format)
  • 功能作用:实现时间数据的展示层格式化,明确时间对象(用于计算)与字符串(用于显示)的用途边界

25.日期对象范围比较

python 复制代码
'''
需求:获取2025-05-09 15:00:00 ~ 2025-05-09 15:30:00
判断一个时间是否位于范围区间 => 统一操作规范:不限制版本 => 兼容时间对象 => datetime
'''
# 1. 导入datetime时间模块
from datetime import datetime

# 2. 定义一个时间范围
start_time = datetime.strptime('09/May/2025:15:00:00', '%d/%b/%Y:%H:%M:%S')  # datetime对象
end_time = datetime.strptime('09/May/2025:15:30:00', '%d/%b/%Y:%H:%M:%S')  # datetime对象

# 3、定义一个日志时间,判断是否位于start_time与end_time之间
log_time = '09/May/2025:15:20:30'
log_time = datetime.strptime(log_time, '%d/%b/%Y:%H:%M:%S')  # datetime对象

# 4. datetime支持直接比较
if start_time <= log_time <= end_time:
    print('位于时间范围区间')
else:
    print('不位于时间范围区间')

📝 代码总结

  • 核心知识点datetime 对象的时间区间比较
  • 实现逻辑 :将起止时间与目标时间统一转为 datetime 对象,使用链式比较运算符判断是否落在区间内
  • 关键语法start <= target <= end(datetime 对象)
  • 功能作用:演示时间对象原生支持大小比较的特性,提供安全、直观的时间范围过滤逻辑

26.Nginx访问日志指定时间过滤操作

python 复制代码
'''
已知条件:nginx_access.log访问日志,日志格式
185.35.115.83 - - [04/May/2025:13:53:53 +0000] "GET /cart HTTP/1.1" 200 267 "http://example.com/login" "curl/7.68.0"
需求:从nginx_access.log中过滤出2025-05-09 15:00:00 ~ 15:30:00
思路:
① 打开文件,读取每一行
② 截取日志中的时间,转换为datetime时间对象
③ 定义一个起始 + 结束范围区间,判断是否符合范围区间,是保留,非不保留
'''
from datetime import datetime
import os
# 定义一个函数,专门用于实现对Nginx访问日志文件进行过滤
def filter_log_by_time(log_file, start_time, end_time):
    # 定义一个列表,用于保存指定时间内的日志信息(一行一行保存)
    result = []
    # 使用with语句,获取文件每一行
    with open(log_file, 'r', encoding='utf-8') as file:
        for line in file:
            parts = line.split(' ')
            # 截取日志中的时间字段,然后转换为datetime时间对象
            log_time = datetime.strptime(parts[3][1:], '%d/%b/%Y:%H:%M:%S')
            # 判断log_time是否位于start_time 与 end_time时间范围
            if start_time <= log_time <= end_time:
                result.append(line)
    # 当函数执行完毕后,日志筛选结束了,使用return返回最终列表
    return result

# 调用函数,执行日志筛选 => 主程序 => 建议定义一个入口(必须,Python社区建议)
if __name__ == '__main__':
    # 定义一个日志文件路径
    log_file = os.path.dirname(__file__) + '/nginx_access.log'
    # 定义两个时间,起始时间、结束时间 => datetime对象
    start_time = datetime.strptime('09/May/2025:15:00:00', '%d/%b/%Y:%H:%M:%S')
    end_time = datetime.strptime('09/May/2025:15:30:00', '%d/%b/%Y:%H:%M:%S')
    # 调用函数,等待返回结果
    data = filter_log_by_time(log_file, start_time, end_time)
    for line in data:
        print(line)

📝 代码总结

  • 核心知识点:日志时间过滤函数封装与工程化调用
  • 实现逻辑 :逐行读取日志,切割提取时间字段转为 datetime 对象,比对区间后符合条件则存入列表并返回;主程序规范入口调用
  • 关键语法 :文件迭代,字符串切割,strptime,区间判断,if __name__ == '__main__':
  • 功能作用:综合文件 I/O、时间处理与函数封装,实现真实运维场景的日志精准筛选工具

27.数据对象转换为JSON格式json.dump()

vscode 中使用 alt + shift + f 转换为可读性更改的输出格式

python 复制代码
import json

dict1 = {'name':'kaser','age':'21','address':'xian'}
dict2 = [{'name':'saker','age':'23','address':'shanghai'},{'name':'kkk','age':'26','address':'beijing'}]

# 单元素转化
with open('data-1.json','w') as file:
    json.dump(dict1,file)
# 多元素转换
with open('data-2.json','w') as file:
    json.dump(dict2,file)

print("python 对象转为 Json 数据转换完成,请查看相关文件!")


📝 代码总结

  • 核心知识点 :Python 对象序列化 JSON (json.dump)
  • 实现逻辑 :导入 json 模块,定义列表嵌套字典结构,使用 dump 直接将内存对象写入 JSON 文件
  • 关键语法import jsonjson.dump(obj, file)
  • 功能作用:演示内存数据结构到 JSON 文件的持久化存储,支持复杂嵌套结构的直接转换

28.加载JSON文件到Python对象json.load()

python 复制代码
import json

# 读取JSON文件,把里面的数据转换为Python对象(如列表或者字典)
with open('data-1.json','r') as file:
    result = json.load(file)
    print(result,type(result))
# 读取JSON文件,把里面的数据转换为Python对象(如列表或者字典)
with open('data-2.json','r') as file:
    result = json.load(file)
    print(result,type(result))

📝 代码总结

  • 核心知识点 :JSON 文件反序列化 (json.load)
  • 实现逻辑 :打开 JSON 文件,使用 load 读取内容并自动还原为 Python 列表/字典对象
  • 关键语法json.load(file)
  • 功能作用:实现 JSON 数据到内存对象的逆向转换,验证数据序列化/反序列化的完整闭环

29.对象转JSON格式数据之中文说明

python 复制代码
import json

# 1. 定义一个Python字典对象
dict1 = {'name':'张三', 'age':23, 'address':'河南省郑州市'}
# 2. 把Python对象转换为JSON数据格式
with open('data.json', 'w', encoding='utf-8') as file:
    json.dump(dict1, file, ensure_ascii=False)
# 3. 解析JSON文件到Python对象(列表、字典)
# with open('data.json', 'r', encoding='utf-8') as file:
#     data = json.load(file)
#     print(data)

📝 代码总结

  • 核心知识点:JSON 序列化中文编码处理
  • 实现逻辑 :序列化含中文字典时,添加 ensure_ascii=False 参数防止中文被转义为 Unicode 编码
  • 关键语法json.dump(obj, file, ensure_ascii=False)
  • 功能作用:解决 JSON 存储中文时的可读性问题,确保跨语言数据交换时的字符保真与显示正确

30.实现Nginx访问日志分析与处理

nginx_access.log文件在文件夹中

python 复制代码
"""
1.224.235.228 - - [06/May/2025:14:47:15 +0000] "GET /login HTTP/1.1" 500 1665 "http://example.com/api/data" "PostmanRuntime/7.28.4"
拆解索引位置:
    IP          -> 0 -> [0]
    Time        -> 3 -> [3][1:]
    Method      -> 5 -> [5][1:]
    Path        -> 6 -> [6]
    Stats_Code  -> 8 -> [8]

    "Nginx 访问日志时间筛选工具"
"""
import json
import datetime

# 定义日志筛选函数 --> 筛选出符合要求的信息
def log_filter_by_time(log_file,start_time,end_time):
    result = []
    with open(log_file,'r',encoding='utf-8') as file:
        for line in file:
            parts = line.split()
            log_time = datetime.datetime.strptime(parts[3][1:],'%d/%b/%Y:%H:%M:%S')
            if start_time <= log_time <= end_time:
                result.append({
                    'IP':parts[0],
                    'Time':parts[3][1:],
                    'Method':parts[5][1:],
                    'Path':parts[6],
                    'Stats_Code':parts[8],
                })
    return result

# 定义信息存储函数 --> 将筛选出的Python列表-->Json数据文件
def save_data_to_json(result,json_file):
    with open(json_file,'w',encoding='utf-8') as file:
        json.dump(result,file,indent=2,ensure_ascii=False)
    print(f"恭喜,数据已经保存至{json_file}文件中,你可以去查看一下!")

# 定义Json读取函数 --> 将Json数据转换成Python对象
def load_data_to_python(json_file):
    with open(json_file,'r',encoding='utf-8') as file:
        result = json.load(file)
    return result

# 定义程序入口
if __name__ == '__main__':
    log_file = './nginx_access.log'
    start_time = datetime.datetime.strptime('09/May/2025:15:00:00','%d/%b/%Y:%H:%M:%S')
    end_time = datetime.datetime.strptime('09/May/2025:15:30:00','%d/%b/%Y:%H:%M:%S')

    log_filter = log_filter_by_time(log_file,start_time,end_time)
    save_data_to_json(log_filter,'./xxx.json')
    log_result = load_data_to_python('./xxx.json')

    for i in log_result:
        print(i)

📝 代码总结

  • 核心知识点:日志解析、JSON 存储与读取全流程综合实战
  • 实现逻辑:定义过滤函数提取日志关键字段构造字典列表;定义 JSON 读写函数封装序列化逻辑;主入口串联筛选、保存、回读打印全流程
  • 关键语法 :函数模块化设计,datetime 解析,字典构造,json.dump/load,工程入口规范
  • 功能作用:完整实现"日志解析→数据清洗→结构化存储→数据回读"的 ETL 流水线,展示模块化工程架构与真实数据处理能力

进阶语法-系统资源监控与数据采集

相关推荐
lbb 小魔仙1 小时前
Python + LangChain 环境搭建完全指南:从零构建本地 RAG 知识库(附 Ollama 本地模型集成)
开发语言·python·langchain
风落无尘1 小时前
Python 包发布全流程:从项目结构到 PyPI 上线,以及我踩过的那些坑
开发语言·python·pip
xxjj998a1 小时前
PHP vs C#:两大编程语言终极对比
开发语言·c#·php
Lenyiin1 小时前
《LeetCode 顺序刷题》61 - 70
java·c++·python·算法·leetcode·lenyiin
匀泪1 小时前
云原生(Kubernetes存储)
前端·chrome
岁岁的O泡奶1 小时前
NSSCTF_crypto_[LitCTF 2023]babyLCG
经验分享·python·算法·密码学·crypto·流密码
风落无尘1 小时前
我用 LangChain 写了一个带“定速巡航”的向量化工具,发布到 PyPI 了!
人工智能·python·langchain
AI技术控1 小时前
RAG 效果差不是模型问题:10 个检索增强失败原因总结
人工智能·python·自然语言处理
敲代码的瓦龙2 小时前
Android?基础UI控件!!!
java·开发语言