【Python】 基于Python实现日志聚合与分析工具:利用Logstash与Fluentd构建高效分布式日志系统

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门!

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界

在分布式系统中,日志数据的生成速度和数量呈指数级增长,传统的日志管理方式已无法满足现代企业对实时性、可扩展性和高效性的需求。本文深入探讨了如何使用Python结合Logstash和Fluentd等开源工具,构建一个高效的日志聚合与分析系统。通过详细的代码示例和中文注释,本文涵盖了日志收集、传输、存储、分析和可视化的全流程。我们将介绍Logstash和Fluentd的基本原理与配置方法,展示如何利用Python脚本实现日志的自定义处理与分析,并探讨在分布式环境下的优化策略。最后,本文还提供了一个完整的示例项目,帮助读者快速上手并应用于实际生产环境中。通过本文的学习,读者将能够掌握构建高效、可扩展日志管理系统的关键技术,为提升系统运维效率和业务决策能力提供有力支持。

目录

  1. 引言
  2. 日志聚合与分析概述
  3. 工具介绍:Logstash与Fluentd
  4. 环境搭建与配置
    • 4.1 安装与配置Logstash
    • 4.2 安装与配置Fluentd
  5. 使用Python进行日志收集
    • 5.1 Python日志模块简介
    • 5.2 自定义日志收集脚本
  6. 使用Python与Logstash集成
    • 6.1 Logstash输入插件配置
    • 6.2 Logstash过滤插件配置
    • 6.3 Logstash输出插件配置
    • 6.4 Python与Logstash的交互示例
  7. 使用Python与Fluentd集成
    • 7.1 Fluentd输入插件配置
    • 7.2 Fluentd过滤插件配置
    • 7.3 Fluentd输出插件配置
    • 7.4 Python与Fluentd的交互示例
  8. 日志数据的存储与索引
    • 8.1 Elasticsearch简介
    • 8.2 Logstash与Elasticsearch的集成
    • 8.3 Fluentd与Elasticsearch的集成
  9. 日志分析与可视化
    • 9.1 Kibana简介与配置
    • 9.2 使用Kibana进行日志可视化
    • 9.3 Python进行日志数据分析
    • 9.4 可视化分析示例
  10. 实时监控与报警
    • 10.1 实时日志监控的重要性
    • 10.2 使用Elasticsearch Watcher进行报警
    • 10.3 Python实现自定义报警机制
  11. 案例分析:分布式系统日志分析
    • 11.1 系统架构概述
    • 11.2 日志收集与聚合流程
    • 11.3 日志分析与故障排查
  12. 优化与性能调优
    • 12.1 日志系统的性能瓶颈
    • 12.2 Logstash与Fluentd的优化策略
    • 12.3 Python脚本的性能优化
  13. 安全性与合规性考虑
    • 13.1 日志数据的安全传输
    • 13.2 日志数据的访问控制
    • 13.3 合规性要求与日志管理
  14. 示例项目实战
    • 14.1 项目结构
    • 14.2 配置文件详解
    • 14.3 Python脚本实现
    • 14.4 系统部署与测试
  15. 总结与展望

1. 引言

在现代分布式系统中,日志是运维人员和开发者排查问题、优化性能的重要依据。随着系统规模的扩大和复杂度的增加,日志数据的生成速度和数量也急剧上升,传统的手工收集和分析方式已经无法满足需求。为了高效地管理和利用日志数据,构建一个自动化、可扩展的日志聚合与分析系统显得尤为重要。本文将介绍如何基于Python实现一个全面的日志聚合与分析工具,结合Logstash和Fluentd等开源工具,打造一个高效的分布式日志系统。

2. 日志聚合与分析概述

日志聚合与分析系统旨在收集分布式系统中各个组件生成的日志数据,进行集中存储、处理和分析,以便于实时监控、故障排查和业务分析。一个典型的日志系统通常包括以下几个核心功能:

  1. 日志收集:从不同来源收集日志数据,包括应用程序日志、系统日志、网络日志等。
  2. 日志传输:将收集到的日志数据传输到集中存储或处理平台。
  3. 日志存储:高效地存储大量日志数据,支持快速检索和查询。
  4. 日志分析:对存储的日志数据进行处理和分析,提取有价值的信息。
  5. 日志可视化:通过图表和仪表盘展示分析结果,帮助用户直观理解日志数据。
  6. 实时监控与报警:实时监控日志数据中的异常情况,并在发现问题时及时报警。

为了实现上述功能,业界常用的工具包括Logstash、Fluentd、Elasticsearch和Kibana等。本文将详细介绍如何使用这些工具,并结合Python脚本,实现一个完整的日志聚合与分析系统。

3. 工具介绍:Logstash与Fluentd

在日志管理领域,Logstash和Fluentd是两款广受欢迎的日志收集和处理工具。它们各自有着不同的特点和优势。

3.1 Logstash

Logstash是由Elastic公司开发的开源数据收集引擎,广泛应用于日志收集、处理和传输。它支持多种输入源、过滤器和输出目标,能够灵活地处理各种类型的数据。Logstash与Elasticsearch和Kibana(统称为ELK Stack)结合使用,可以实现强大的日志分析和可视化功能。

主要特点:

  • 多种输入源:支持文件、网络协议(如TCP、UDP)、消息队列(如Kafka)、数据库等多种数据源。
  • 强大的过滤能力:内置多种过滤器,如grok、date、mutate等,支持自定义插件扩展。
  • 灵活的输出目标:支持Elasticsearch、文件、数据库、消息队列等多种输出方式。
  • 可扩展性:通过插件机制,可以方便地扩展Logstash的功能。

3.2 Fluentd

Fluentd是由Treasure Data开发的开源数据收集器,旨在为日志收集和处理提供统一的解决方案。Fluentd拥有轻量级、高性能和高度可扩展的特点,广泛应用于云原生和微服务架构中。

主要特点:

  • 统一的数据模型:Fluentd使用统一的数据格式(称为Event),简化了不同数据源和目标之间的集成。
  • 插件生态丰富:拥有超过500个插件,支持各种输入、输出和过滤功能。
  • 高性能:采用高效的多线程架构,支持高吞吐量的数据处理。
  • 易于扩展:通过编写Ruby或C语言插件,可以轻松扩展Fluentd的功能。

3.3 Logstash与Fluentd的比较

特性LogstashFluentd
语言JRuby(基于Java)C语言和Ruby
性能较高的内存消耗,适合中等规模日志高性能,适合大规模分布式系统
插件生态丰富,但主要集中在ELK Stack非常丰富,适用于各种场景
配置文件使用专有的配置语法使用统一的配置格式(YAML)
易用性配置较为复杂配置简洁,易于上手

根据具体需求,开发者可以选择适合的工具,或者将两者结合使用,以充分发挥各自的优势。

4. 环境搭建与配置

在开始实现日志聚合与分析系统之前,需要搭建相关的环境,并安装配置所需的工具。本文将以Logstash和Fluentd为例,介绍它们的安装与基本配置。

4.1 安装与配置Logstash

步骤1:下载和安装Logstash

首先,访问Logstash官网下载适用于操作系统的Logstash安装包。以Ubuntu为例,可以使用以下命令安装:

# 导入Elastic GPG key
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -# 安装apt-transport-https
sudo apt-get install apt-transport-https# 添加Elastic仓库
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list# 更新包索引并安装Logstash
sudo apt-get update
sudo apt-get install logstash

步骤2:配置Logstash

Logstash的配置文件通常位于/etc/logstash/conf.d/目录下,文件扩展名为.conf。一个基本的配置文件包含三个部分:输入(input)、过滤(filter)和输出(output)。

创建一个名为logstash.conf的配置文件:

sudo nano /etc/logstash/conf.d/logstash.conf

在文件中添加以下内容:

input {beats {port => 5044}
}filter {grok {match => { "message" => "%{COMMONAPACHELOG}" }}date {match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]}
}output {elasticsearch {hosts => ["localhost:9200"]index => "logstash-%{+YYYY.MM.dd}"}stdout { codec => rubydebug }
}

配置说明:

  • Input部分:使用Beats输入插件,监听5044端口,接收来自Filebeat等Beats客户端发送的日志数据。
  • Filter部分:使用Grok过滤器解析Apache日志格式,并使用Date过滤器将时间戳转换为标准格式。
  • Output部分:将处理后的日志数据发送到本地Elasticsearch实例,并在控制台输出调试信息。

步骤3:启动Logstash

启动并启用Logstash服务:

sudo systemctl start logstash
sudo systemctl enable logstash

4.2 安装与配置Fluentd

步骤1:安装Fluentd

Fluentd有多种安装方式,可以通过包管理器、Docker或源码安装。以使用td-agent(Fluentd的稳定发行版)为例,在Ubuntu上安装:

# 导入Treasure Data的GPG key
curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-bionic-td-agent4.sh | sh

步骤2:配置Fluentd

Fluentd的配置文件通常位于/etc/td-agent/td-agent.conf。编辑配置文件:

sudo nano /etc/td-agent/td-agent.conf

添加以下内容作为示例配置:

<source>@type forwardport 24224
</source><match **>@type elasticsearchhost localhostport 9200logstash_format trueinclude_tag_key truetag_key @log_name
</match>

配置说明:

  • Source部分:使用Forward输入插件,监听24224端口,接收来自Fluentd客户端发送的日志数据。
  • Match部分:将所有匹配的日志数据发送到本地Elasticsearch实例,使用Logstash格式进行索引。

步骤3:启动Fluentd

启动并启用Fluentd服务:

sudo systemctl start td-agent
sudo systemctl enable td-agent

5. 使用Python进行日志收集

Python作为一门强大的编程语言,拥有丰富的标准库和第三方库,适合用于日志的收集、处理和分析。本文将介绍如何使用Python进行日志收集,并将其集成到Logstash和Fluentd中。

5.1 Python日志模块简介

Python内置的logging模块提供了强大的日志记录功能,支持多种日志级别、日志格式和输出目标。通过合理配置,可以将日志数据发送到不同的目的地,如文件、控制台、远程服务器等。

基本用法示例:

import logging# 配置日志
logging.basicConfig(level=logging.INFO,format='%(asctime)s %(levelname)s %(message)s',filename='app.log',filemode='a'
)# 记录日志
logging.info('这是一个信息日志')
logging.error('这是一个错误日志')

5.2 自定义日志收集脚本

为了实现更灵活的日志收集,开发者可以编写自定义的Python脚本,收集特定的日志数据,并通过网络协议(如HTTP、TCP)发送到Logstash或Fluentd。

以下是一个简单的示例,演示如何使用Python收集系统日志并通过HTTP发送到Logstash。

步骤1:安装必要的库

pip install requests

步骤2:编写日志收集与发送脚本

import logging
import requests
import time
import json# 配置日志
logging.basicConfig(level=logging.INFO,format='%(asctime)s %(levelname)s %(message)s',filename='system.log',filemode='a'
)def send_log_to_logstash(log_data, logstash_url):"""通过HTTP将日志数据发送到Logstash:param log_data: 字典格式的日志数据:param logstash_url: Logstash的HTTP输入端点"""headers = {'Content-Type': 'application/json'}try:response = requests.post(logstash_url, data=json.dumps(log_data), headers=headers)if response.status_code == 200:logging.info('日志成功发送到Logstash')else:logging.error(f'发送日志失败,状态码: {response.status_code}')except Exception as e:logging.error(f'发送日志时发生异常: {e}')def collect_system_metrics():"""模拟收集系统指标数据:return: 字典格式的系统指标"""# 这里可以集成psutil等库收集实际的系统指标return {'timestamp': time.strftime("%Y-%m-%d %H:%M:%S"),'cpu_usage': 55.5,  # 示例数据'memory_usage': 70.2  # 示例数据}if __name__ == "__main__":logstash_http_url = 'http://localhost:8080/logs'  # 替换为实际的Logstash HTTP输入端点while True:metrics = collect_system_metrics()send_log_to_logstash(metrics, logstash_http_url)logging.info(f'收集并发送系统指标: {metrics}')time.sleep(60)  # 每60秒收集一次

代码说明:

  • send_log_to_logstash函数:将日志数据通过HTTP POST请求发送到Logstash的HTTP输入端点。
  • collect_system_metrics函数:模拟收集系统指标数据,可以使用psutil库获取实际的CPU和内存使用率。
  • 主程序:每60秒收集一次系统指标,并将其发送到Logstash,同时记录日志到本地文件。

步骤3:运行脚本

确保Logstash的HTTP输入插件已正确配置,并启动Logstash服务。然后运行Python脚本:

python log_sender.py

6. 使用Python与Logstash集成

Logstash作为一个强大的数据收集和处理工具,可以与Python脚本无缝集成,实现灵活的日志处理流程。本文将介绍如何通过Python与Logstash进行集成,包括输入插件、过滤插件和输出插件的配置,以及如何通过Python脚本发送日志数据到Logstash。

6.1 Logstash输入插件配置

Logstash支持多种输入插件,用于接收不同来源的数据。本文以HTTP输入插件为例,展示如何配置Logstash以接收来自Python脚本发送的日志数据。

配置示例:

input {http {port => 8080codec => json}
}

说明:

  • http输入插件监听8080端口,接收HTTP POST请求。
  • codec设置为json,表示接收的数据为JSON格式,并自动解析为Logstash事件。

6.2 Logstash过滤插件配置

过滤插件用于对输入的数据进行处理和转换。常用的过滤插件包括Grok、Date、Mutate等。以下示例展示如何使用Grok和Date过滤器处理日志数据。

配置示例:

filter {grok {match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{WORD:metric} %{NUMBER:value}" }}date {match => [ "timestamp", "ISO8601" ]}
}

说明:

  • Grok过滤器:解析消息字段,将其拆分为timestampmetricvalue三个字段。
  • Date过滤器:将timestamp字段转换为标准的时间格式。

6.3 Logstash输出插件配置

输出插件用于将处理后的数据发送到指定的目标。本文以Elasticsearch和控制台输出为例,展示如何配置输出插件。

配置示例:

output {elasticsearch {hosts => ["localhost:9200"]index => "python-logstash-%{+YYYY.MM.dd}"}stdout { codec => rubydebug }
}

说明:

  • Elasticsearch输出插件:将日志数据发送到本地的Elasticsearch实例,并按照日期创建索引。
  • Stdout输出插件:将日志数据输出到控制台,便于调试和查看。

6.4 Python与Logstash的交互示例

以下示例展示了如何使用Python脚本通过HTTP发送日志数据到Logstash。

import requests
import json
import time
import logging# 配置日志
logging.basicConfig(level=logging.INFO,format='%(asctime)s %(levelname)s %(message)s',filename='logstash_sender.log',filemode='a'
)def send_log_to_logstash(log_data, logstash_url):"""通过HTTP将日志数据发送到Logstash:param log_data: 字典格式的日志数据:param logstash_url: Logstash的HTTP输入端点"""headers = {'Content-Type': 'application/json'}try:response = requests.post(logstash_url, data=json.dumps(log_data), headers=headers)if response.status_code == 200:logging.info('日志成功发送到Logstash')else:logging.error(f'发送日志失败,状态码: {response.status_code}')except Exception as e:logging.error(f'发送日志时发生异常: {e}')def collect_application_logs():"""模拟收集应用日志数据:return: 字典格式的应用日志"""return {'timestamp': time.strftime("%Y-%m-%dT%H:%M:%S"),'metric': 'cpu_usage','value': 65.3  # 示例数据}if __name__ == "__main__":logstash_http_url = 'http://localhost:8080'  # Logstash HTTP输入端点while True:log_entry = collect_application_logs()send_log_to_logstash(log_entry, logstash_http_url)logging.info(f'收集并发送应用日志: {log_entry}')time.sleep(30)  # 每30秒发送一次

代码说明:

  • send_log_to_logstash函数:通过HTTP POST请求将日志数据发送到Logstash的HTTP输入端点。
  • collect_application_logs函数:模拟收集应用日志数据,可以根据实际需求修改为收集真实的应用日志。
  • 主程序:每30秒收集一次应用日志,并发送到Logstash,同时记录日志到本地文件。

运行脚本:

确保Logstash服务已启动,并正确配置了HTTP输入插件。然后运行Python脚本:

python logstash_integration.py

通过上述步骤,Python脚本将定期发送日志数据到Logstash,Logstash将其处理后存储到Elasticsearch,并在控制台输出调试信息。

7. 使用Python与Fluentd集成

Fluentd作为一款高性能的日志收集工具,可以与Python脚本无缝集成,实现高效的日志传输和处理。本文将介绍如何通过Python与Fluentd进行集成,包括输入插件、过滤插件和输出插件的配置,以及如何通过Python脚本发送日志数据到Fluentd。

7.1 Fluentd输入插件配置

Fluentd支持多种输入插件,用于接收不同来源的数据。本文以Forward输入插件为例,展示如何配置Fluentd以接收来自Python脚本发送的日志数据。

配置示例:

<source>@type forwardport 24224
</source>

说明:

  • forward输入插件监听24224端口,接收来自Fluentd客户端发送的日志数据。

7.2 Fluentd过滤插件配置

过滤插件用于对输入的数据进行处理和转换。常用的过滤插件包括Parser、Grep、Record Transformer等。以下示例展示如何使用Parser和Record Transformer过滤器处理日志数据。

配置示例:

<filter **>@type parserformat jsonkey_name messagereserve_data true
</filter><filter **>@type record_transformer<record>hostname "#{Socket.gethostname}"</record>
</filter>

说明:

  • Parser过滤器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04.HTTPS的实现原理-HTTPS的混合加密流程

04.HTTPS的实现原理-HTTPS的混合加密流程 简介1. 非对称加密与对称加密2. 非对称加密的工作流程3. 对称加密的工作流程4. HTTPS的加密流程总结 简介 主要讲述了HTTPS的加密流程&#xff0c;包括非对称加密和对称加密两个阶段。首先&#xff0c;客户端向服务器发送请求&#xf…

【从零开始入门unity游戏开发之——C#篇34】C#匿名函数(delegate )和Lambda表达式

文章目录 一、匿名函数&#xff08;delegate &#xff09;1、什么是匿名函数&#xff1f;2、匿名函数的基本语法2.1 语法2.2 **没有参数的匿名函数&#xff1a;**2.3 **有参数的匿名函数&#xff1a;**2.4 **有返回值的匿名函数&#xff1a;** 3、匿名函数的使用示例3.1 作为参…

IDEA开发Java应用的初始化设置

一、插件安装 如下图所示&#xff1a; 1、Alibaba Java Coding Guidelines 2.1.1 阿里开发者规范&#xff0c;可以帮忙本地自动扫描出不符合开发者规范的代码&#xff0c;甚至是代码漏洞提示。 右击项目&#xff0c;选择《编码规约扫描》&#xff0c;可以进行本地代码规范扫…

代码模拟打字机(python)

回车符\r打印稿纸&#xff0c;time.sleep模拟停顿效果&#xff0c;一顿一顿的打字机效果就此呈现。 (笔记模板由python脚本于2024年12月27日 19:34:37创建&#xff0c;本篇笔记适合有基础编程能力的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.…

让 AMD GPU 在大语言模型推理中崭露头角:机遇与挑战

在当今科技飞速发展的时代&#xff0c;大语言模型&#xff08;LLM&#xff09;的兴起彻底改变了人工智能领域的格局。从智能客服到文本生成&#xff0c;从知识问答到代码编写辅助&#xff0c;大语言模型的应用无处不在&#xff0c;深刻影响着我们的生活和工作。然而&#xff0c…

LLMs之o3:《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读

LLMs之o3&#xff1a;《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读 导读&#xff1a;2024年12月&#xff0c;这篇论文提出了一种名为“审慎式对齐 (Deliberative Alignment)”的新方法&#xff0c;旨在提高大型语言模型 (LLM) 的安全性。论…

音视频入门基础:MPEG2-TS专题(24)——FFmpeg源码中,显示TS流每个packet的pts、dts的实现

音视频入门基础&#xff1a;MPEG2-TS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;1&#xff09;——MPEG2-TS官方文档下载 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ts文件 音视频入门基础…

微信流量主挑战:用户破16!新增文档转换(新纪元3)

朋友们&#xff0c;报告好消息&#xff01;我的小程序用户数量已经涨到16个了&#xff01;没错&#xff0c;真没拉朋友圈亲戚好友来撑场子&#xff0c;全靠实力&#xff08;和一点点运气&#xff09;吸引了16位陌生小伙伴光临&#xff01;这波进步&#xff0c;连我自己都感动了…

顶顶通呼叫中心中间件mod_cti模块安全增强,预防盗打风险(mod_cti基于FreeSWITCH)

文章目录 前言联系我们mod_cti版本支持安全加强说明 前言 FreeSWITCH暴露在公网最大的风险就是被不法之人盗打 出现盗打的主要原因以下几点&#xff1a; 分机密码太简单或者密码泄露了拨号方案配置不合理sofia配置错误 所以我们给顶顶通呼叫中心中间件添加了安全加强功能&am…

【Halcon】例程讲解:基于形状匹配与OCR的多图像处理(附图像、程序下载链接)

1. 开发需求 在参考图像中定义感兴趣区域&#xff08;ROI&#xff09;&#xff0c;用于形状匹配和文本识别。通过形状匹配找到图像中的目标对象位置。对齐多幅输入图像&#xff0c;使其与参考图像保持一致。在对齐后的图像上进行OCR识别&#xff0c;提取文本和数字信息。以循环…

产品初探Devops!以及AI如何赋能Devops?

DevOps源自Development&#xff08;开发&#xff09;和Operations&#xff08;运维&#xff09;的组合&#xff0c;是一种新的软件工程理念&#xff0c;旨在打破传统软件工程方法中“开发->测试->运维”的割裂模式&#xff0c;强调端到端高效一致的交付流程&#xff0c;实…

python+PyMuPDF库:(一)创建pdf文件及内容读取和写入

目录 文档操作 打开文档 获取文档信息 删除页 复制页 移动页 选择重构合并 保存关闭 页对象操作 内容读取 获取页对象的字体样式 插入文本标签 插入文本内容 字体设置 insert_text添加文本 insert_textbox添加文本 插入图片 获取页面注释、链接、表单字段 …

开源诊断工具Arthas

说明&#xff1a; 1、需要先要安装配置好jdk。 2、你的虚拟机得有网&#xff0c;没有网就按照压缩包上传解压。然后直接看三 一、官网 https://arthas.aliyun.com/doc/quick-start.html#_1-%E5%90%AF%E5%8A%A8-math-game 二、下载和卸载 # 下载 curl -O https://arthas.al…

VisionPro开发使用交互反馈系统(Affordance System)

XR Interaction Toolkit 提供了一个affordance system 可供性系统&#xff0c;使用户能够创建对交互状态的视觉和听觉反馈。一般的信息流从向Affordance State Provider场景中添加一个&#xff08;通常是可交互的&#xff09;并将其指向我们要监视其交互状态的可交互对象开始。…

如何在 Ubuntu 22.04 上安装并开始使用 RabbitMQ

简介 消息代理是中间应用程序&#xff0c;在不同服务之间提供可靠和稳定的通信方面发挥着关键作用。它们可以将传入的请求存储在队列中&#xff0c;并逐个提供给接收服务。通过以这种方式解耦服务&#xff0c;你可以使其更具可扩展性和性能。 RabbitMQ 是一种流行的开源消息代…

力扣矩阵-算法模版总结

lc-73.矩阵置零-(时隔14天)-12.27 思路&#xff1a;(23min22s) 1.直接遍历遇0将行列设0肯定不行&#xff0c;会影响后续判断&#xff0c;题目又要求原地算法&#xff0c;那么进一步考虑是否可以将元素为0&#xff0c;其行列需要设为0的位置给存储下来&#xff0c;最后再遍历根据…

OCR实践-问卷表格统计

前言 书接上文 OCR实践—PaddleOCROCR实践-Table-Transformer 本项目代码已开源 放在 Github上&#xff0c;欢迎参考使用&#xff0c;Star https://github.com/caibucai22/TableAnalysisTool 主要功能说明&#xff1a;对手动拍照的问卷图片进行统计分数&#xff08;对应分数…

yarn list --pattern vuex-module-decorators

dgqdgqdeMac-mini spid-admin % yarn list --pattern vuex-module-decorators yarn list v1.22.22 └─ vuex-module-decorators0.16.1 ✨ Done in 0.24s.好的&#xff0c;这段代码是一个典型的 Vuex 模块定义&#xff0c;使用了 vuex-module-decorators 库。这个库为 Vuex 提…

用Python写炸金花游戏

文章目录 **代码分解与讲解**1. **扑克牌的生成与洗牌**2. **给玩家发牌**3. **打印玩家的手牌**4. **定义牌的优先级**5. **判断牌型**6. **确定牌型优先级**7. **比较两手牌的大小**8. **打印结果** 完整代码 以下游戏规则&#xff1a; 那么我们要实现的功能&#xff0c;就是…

day19-Linux软件包

科普&#xff0c;什么是代码文件。 电脑程序Program&#xff0c;就是某一个编程语言编写的一个代码文件&#xff0c;里面包含了该语言特有的指令&#xff0c;以及各种字符、符号。 linux自带的network管理脚本&#xff0c;shell脚本 什么是软件程序。 软件程序&#xff0c;就…