百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

自动生成电力巡检报告:Python 代码实现

toyiye 2024-06-21 19:19 14 浏览 0 评论

本文将介绍如何使用 Python 代码自动生成包含截图的电力巡检报告,并分析代码的实现细节。

功能概述

该代码主要实现以下功能:


  1. 自动截取文本文件末尾内容并生成截图:针对每个日期的巡检结果文件(Result_*.txt),程序自动截取末尾20行内容生成对应日期的截图。
  2. 生成 Word 巡检报告:将每个日期的截图以及日期信息整合到一个 Word 文档中,方便查看和保存。
  3. 日期范围控制:用户可以通过设置开始日期和结束日期,控制生成报告的日期范围。


代码分析

代码主要包含两个核心函数:take_screenshot 和 generate_report,以及主函数 main。

  • take_screenshot(filename, date_str) 函数负责截取指定文本文件 (filename) 的末尾内容并生成截图。它首先读取文本文件末尾20行内容,并使用 Pillow 库将这些内容绘制到一张白色背景的图片上。然后,它根据日期信息 (date_str) 生成截图文件名,并保存到指定的图片目录。为了避免重复插入相同日期的截图,代码会先检查图片目录中是否存在该日期的截图文件,如果存在则删除旧文件,再生成新的截图。


  • generate_report(doc, date_str, screenshot_dir, start_date, end_date) 函数负责将截图插入到 Word 文档 (doc) 中。它首先判断当前日期是否在指定的日期范围内。如果当前日期在范围内,它会从截图目录 (screenshot_dir) 中查找对应日期的截图文件,并将其插入到 Word 文档中。


  • main() 函数是程序的入口,它负责调用其他函数完成以下操作:设置开始日期和结束日期。创建一个空的 Word 文档。循环遍历每个日期,并调用 take_screenshot 函数生成截图。循环遍历每个日期,并调用 generate_report 函数将截图插入到 Word 文档中。保存生成的 Word 文档。


代码优化建议

代码可读性:可以添加注释解释代码的逻辑,提高代码可读性。

错误处理:可以添加异常处理机制,防止程序因为文件不存在或其他错误而崩溃。

代码扩展:可以添加功能,例如:从数据库中读取巡检结果数据,避免每次都读取文本文件。使用模板库生成 Word 文档,提高代码的可维护性。添加邮件发送功能,将生成的报告自动发送给相关人员。


import os
from datetime import datetime, timedelta

from PIL import Image, ImageDraw, ImageFont
from docx import Document
from docx.shared import Inches


def take_screenshot(filename, date_str):
    """
    截取文件末尾指定行数的截图。

    Args:
      filename: 要截取的文本文件路径。
      date_str: 报告日期字符串。

    Returns:
      截图图片路径。
    """

    # 获取文件路径
    # file_path = os.path.join(r"D:\code\python\PycharmProjects\pythonProject\Inspectionreport\txt", filename)  # 修改路径

    # 获取当前工作目录
    base_dir = os.getcwd()
    file_path = os.path.join(base_dir, "txt", filename)

    # 使用 Python 的内置方法读取文件末尾几行
    with open(file_path, 'r', encoding='utf-8') as f:
        lines = f.readlines()[-20:]  # 截取末尾20行
    tail_output = ''.join(lines)

    # 获取截图文件路径
    # screenshot_dir = os.path.join(r"D:\code\python\PycharmProjects\pythonProject\Inspectionreport\image")  # 修改路径
    screenshot_dir = os.path.join(base_dir, "image")
    os.makedirs(screenshot_dir, exist_ok=True)

    # 提取txt文件名的日期部分
    date_part = filename.split('_')[1]  # 提取日期部分

    # 生成截图文件名,包含日期
    screenshot_file = f"{date_part}_{date_str}.png"

    # 查找并删除旧截图文件
    for file in os.listdir(screenshot_dir):
        if file.startswith(date_part) and file.endswith(".png"):
            os.remove(os.path.join(screenshot_dir, file))

    # 使用 Pillow 库生成截图
    try:
        font = ImageFont.truetype("C:/Windows/Fonts/simfang.ttf", 12)  # 使用系统默认字体 Arial
    except IOError:
        font = ImageFont.load_default()  # 使用默认字体

    img = Image.new('RGB', (800, 350), color='white')  # 创建白色背景图像,调整高度以适应文本
    draw = ImageDraw.Draw(img)
    draw.text((10, 10), tail_output, fill='black', font=font)
    img.save(os.path.join(screenshot_dir, screenshot_file))  # 保存截图到最新的文件名

    return os.path.join(screenshot_dir, screenshot_file)


def generate_report(doc, date_str, screenshot_dir, start_date, end_date):
    # 添加日期段落
    date_paragraph = doc.add_paragraph()
    date_paragraph.add_run(f"{date_str} 巡检报告").bold = True

    # 转换日期字符串为 datetime 对象
    date_obj = datetime.strptime(date_str, "%Y年%m月%d日")

    # 判断日期是否在指定范围内
    if start_date <= date_obj <= end_date:
        # 获取当前日期对应的截图文件
        for file in os.listdir(screenshot_dir):
            file_date_str = file[:10]  # 提取文件名前10位日期部分
            if file_date_str == date_obj.strftime("%Y-%m-%d") and file.endswith(".png"):
                print(f"找到截图文件:{file}")
                screenshot_file = os.path.join(screenshot_dir, file)
                # 添加图片
                doc.add_picture(screenshot_file, width=Inches(6))
                break  # 找到一个就停止,避免重复插入


def main():
    # screenshot_dir = r"D:\code\python\PycharmProjects\pythonProject\Inspectionreport\image"
    # 获取当前工作目录
    base_dir = os.getcwd()
    screenshot_dir = os.path.join(base_dir, "image")
    start_date = datetime(2024, 5, 15)
    end_date = datetime(2024, 6, 18)  # 调整结束日期为 6 月 18 日

    # 创建 Word 文档
    doc = Document()
    doc.add_heading("电力重保巡检报告", level=1)

    # 先执行 take_screenshot 函数生成截图
    current_date = start_date
    while current_date <= end_date:
        date_str = current_date.strftime("%Y年%m月%d日")

        # # 获取 FZHZ4-ARM 目录下的所有 Result_*.txt 文件
        # result_files = [f for f in os.listdir(r"D:\code\python\PycharmProjects\pythonProject\Inspectionreport\txt")
        #                 if f.startswith("Result_") and f.endswith(".txt")]

        # 获取当前工作目录下 FZHZ4-ARM 目录下的所有 Result_*.txt 文件
        txt_dir = os.path.join(base_dir, "txt")
        result_files = [f for f in os.listdir(txt_dir)
                        if f.startswith("Result_") and f.endswith(".txt")]

        # 生成每日的截图
        if result_files:
            for result_file in result_files:
                take_screenshot(result_file, date_str)

        current_date += timedelta(days=1)

    # 再调用 generate_report 函数插入截图
    current_date = start_date
    while current_date <= end_date:
        date_str = current_date.strftime("%Y年%m月%d日")
        generate_report(doc, date_str, screenshot_dir, start_date, end_date)
        current_date += timedelta(days=1)

    # 保存汇总报告
    # report_path = r"D:\code\python\PycharmProjects\pythonProject\Inspectionreport\report\电力巡检汇总.docx"
    report_path = os.path.join(base_dir, "report", "电力巡检汇总.docx")
    os.makedirs(os.path.dirname(report_path), exist_ok=True)
    doc.save(report_path)


if __name__ == "__main__":
    main()




总结

本文介绍了使用 Python 代码自动生成电力巡检报告的方法,并分析了代码的实现细节

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码