You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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"]

三、创建依赖文件和启动脚本

  1. requirements.txt:
pandas==2.1.4
prettytable==3.10.0
  1. 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容器

  1. 构建镜像:
docker build -t csv-analyzer .
  1. 运行容器(挂载本地文件夹到容器内的/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:30:55