优秀的编程知识分享平台

网站首页 > 技术文章 正文

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

nanyue 2025-02-13 13:31:46 技术文章 7 ℃

本文将介绍如何使用 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 代码自动生成电力巡检报告的方法,并分析了代码的实现细节

最近发表
标签列表