如何在Docker容器中每15秒周期性运行Python CSV处理代码
解决方案:将CSV数据分析脚本部署为Docker周期性任务
一、修改Python脚本适配批量文件处理
原脚本仅处理固定文件,需调整为遍历输入文件夹(文件夹A)中的所有CSV文件,输出同名HTML到输出文件夹(文件夹B):
# 本程序从CSV文件提取数据并生成HTML文件展示。 # CSV文件包含设备名称、板卡名称及板卡温度信息。 # 生成的HTML文件包含:系统中的设备总数、板卡总数、拥有最高温度板卡的设备; # 下方表格展示各设备的板卡总数、温度≥70的板卡数量、最高温度及平均温度 import os import pandas as pd from prettytable import PrettyTable, PLAIN_COLUMNS def process_csv(input_path, output_path): # 创建设备信息表格 table = PrettyTable() # 创建汇总信息表格 table2 = PrettyTable() table.field_names = ["Device", "Total # of Cards", "High Temp. Cards #", "Max Temperature", "Avg. Temperature"] table2.field_names = [" ", " "] # 读取CSV文件 df = pd.read_csv(input_path, sep=';', usecols=['Device','Card','Temperature']) if df.empty: return # 计算汇总数据 total_devices = df["Device"].nunique() total_cards = len(df["Card"]) max_temp = df['Temperature'].max() # 查找拥有最高温度的板卡及其所属设备 hottest_row = df[df['Temperature'] == max_temp].iloc[0] device_name = hottest_row["Device"] card_name = hottest_row["Card"] newstr = f"{card_name}/{device_name}" # 填充汇总表格 table2.add_row(["Total Devices", total_devices]) table2.add_row(["Total Cards", total_cards]) table2.add_row(["Max Card Temperature", max_temp]) table2.add_row(["Hottest Card / Device", newstr]) # 按设备统计详细数据 dev_types = df["Device"].unique() for dev in dev_types: dev_data = df[df["Device"] == dev] card_count = len(dev_data) high_temp_count = len(dev_data[dev_data["Temperature"] >=70]) max_t = dev_data["Temperature"].max() avg_t = dev_data["Temperature"].mean() table.add_row([dev, card_count, high_temp_count, max_t, round(avg_t, 2)]) # 生成HTML内容 html_content = f""" <html> <head> <title>Device Temperature Report</title> <style>table {{border-collapse: collapse; width: 80%; margin: 20px auto;}} th, td {{border: 1px solid #ddd; padding: 8px; text-align: left;}} th {{background-color: #f2f2f2;}}</style> </head> <body> <h2 style="text-align:center;">SUMMARY</h2> {table2.get_html_string()} <h2 style="text-align:center;">DEVICES</h2> {table.get_html_string()} </body> </html> """ # 写入输出文件 with open(output_path, 'w', encoding='utf-8') as f: f.write(html_content) def main(input_dir, output_dir): # 确保输出目录存在 os.makedirs(output_dir, exist_ok=True) # 遍历输入目录下的所有CSV文件 for filename in os.listdir(input_dir): if filename.endswith('.csv'): input_path = os.path.join(input_dir, filename) # 生成同名HTML文件名 output_filename = os.path.splitext(filename)[0] + '.html' output_path = os.path.join(output_dir, output_filename) print(f"Processing {filename}...") process_csv(input_path, output_path) # 可选:处理后删除原CSV文件,避免重复处理 # os.remove(input_path) if __name__ == "__main__": import sys if len(sys.argv) !=3: print("Usage: python script.py <input_directory> <output_directory>") sys.exit(1) input_dir = sys.argv[1] output_dir = sys.argv[2] main(input_dir, output_dir)
二、编写Dockerfile
创建Dockerfile,构建包含Python环境和依赖的镜像:
# 使用官方Python基础镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 复制依赖文件(先复制requirements.txt可利用Docker缓存) COPY requirements.txt . # 安装依赖 RUN pip install --no-cache-dir pandas prettytable # 复制修改后的Python脚本 COPY analyze_csv.py . # 启动脚本:每15秒检查输入目录 COPY start.sh . RUN chmod +x start.sh # 设置默认命令 CMD ["./start.sh"]
三、创建依赖文件和启动脚本
requirements.txt:
pandas==2.1.4 prettytable==3.10.0
start.sh(周期性执行脚本):
#!/bin/sh INPUT_DIR="/data/folderA" OUTPUT_DIR="/data/folderB" # 创建目录(确保挂载后存在) mkdir -p $INPUT_DIR $OUTPUT_DIR echo "Starting periodic CSV processing every 15 seconds..." while true; do # 执行Python脚本处理文件 python analyze_csv.py $INPUT_DIR $OUTPUT_DIR # 等待15秒 sleep 15 done
四、构建并运行Docker容器
- 构建镜像:
docker build -t csv-analyzer .
- 运行容器(挂载本地文件夹到容器内的
/data/folderA和/data/folderB):
docker run -d -v /path/to/local/folderA:/data/folderA -v /path/to/local/folderB:/data/folderB csv-analyzer
替换/path/to/local/folderA和/path/to/local/folderB为你本地的实际文件夹路径。
关键说明
- 文件去重处理:如果需要避免重复处理同一CSV文件,可以在
main函数中添加os.remove(input_path)(已注释),处理后删除原文件;或者记录已处理文件名到日志文件,每次检查时跳过已处理文件。 - 资源占用优化:若CSV文件较大,可调整Python脚本的内存使用(如分块读取);若15秒周期过短,可修改
start.sh中的sleep时间。 - 日志查看:使用
docker logs <container_id>查看脚本运行日志,排查问题。
内容的提问来源于stack exchange,提问作者silagdk
相关产品推荐
相关产品推荐

