本文将介绍如何使用 Python 代码自动生成包含截图的电力巡检报告,并分析代码的实现细节。
功能概述
该代码主要实现以下功能:
- 自动截取文本文件末尾内容并生成截图:针对每个日期的巡检结果文件(Result_*.txt),程序自动截取末尾20行内容生成对应日期的截图。
- 生成 Word 巡检报告:将每个日期的截图以及日期信息整合到一个 Word 文档中,方便查看和保存。
- 日期范围控制:用户可以通过设置开始日期和结束日期,控制生成报告的日期范围。
代码分析
代码主要包含两个核心函数: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 代码自动生成电力巡检报告的方法,并分析了代码的实现细节