vue展示node express调用python解析tdms

python解析的代码:

复制代码
import sys
import json
import numpy as np
from nptdms import TdmsFile

def parse_tdms_file(file_path, group_name):
    """
    解析TDMS文件并返回指定通道的数据
    """
    try:
        # 读取TDMS文件
        tdms_file = TdmsFile.read(file_path)
        
        # 获取指定组和通道
        group = tdms_file[group_name]
        # channel = group[channel_name]
        channel_ia = group["Ia"]
        channel_ib = group["Ib"]
        channel_ic = group["Ic"]
        channel_uab = group["Uab"]
        channel_ubc = group["Ubc"]
        channel_uca = group["Uca"]
        channel_ua = group["Ua"]
        channel_ub = group["Ub"]
        channel_uc = group["Uc"]
        
        # 获取数据
        data_ia = channel_ia[:]
        data_ib = channel_ib[:]
        data_ic = channel_ic[:]
        data_uab = channel_uab[:]
        data_ubc = channel_ubc[:]
        data_uca = channel_uca[:]
        data_ua = channel_ua[:]
        data_ub = channel_ub[:]
        data_uc = channel_uc[:]
        
        # 如果数据太大,可以采样
        # if len(data) > 10000:
        #     indices = np.linspace(0, len(data)-1, 10000, dtype=int)
        #     data = data[indices]
        if len(data_ia) > 10000:
            indices = np.linspace(0, len(data_ia)-1, 10000, dtype=int)
            data_ia = data_ia[indices]
        if len(data_ib) > 10000:
            indices = np.linspace(0, len(data_ib)-1, 10000, dtype=int)
            data_ib = data_ib[indices]
        if len(data_ic) > 10000:
            indices = np.linspace(0, len(data_ic)-1, 10000, dtype=int)
            data_ic = data_ic[indices]
        if len(data_uab) > 10000:
            indices = np.linspace(0, len(data_uab)-1, 10000, dtype=int)
            data_uab = data_uab[indices]
        if len(data_ubc) > 10000:
            indices = np.linspace(0, len(data_ubc)-1, 10000, dtype=int)
            data_ubc = data_ubc[indices]
        if len(data_uca) > 10000:
            indices = np.linspace(0, len(data_uca)-1, 10000, dtype=int)
            data_uca = data_uca[indices]    
        if len(data_ua) > 10000:
            indices = np.linspace(0, len(data_ua)-1, 10000, dtype=int)
            data_ua = data_ua[indices]
        if len(data_ub) > 10000:
            indices = np.linspace(0, len(data_ub)-1, 10000, dtype=int)
            data_ub = data_ub[indices]
        if len(data_uc) > 10000:
            indices = np.linspace(0, len(data_uc)-1, 10000, dtype=int)
            data_uc = data_uc[indices]
        
        # 转换为Python列表
        data_list_ia = data_ia.tolist() if isinstance(data_ia, np.ndarray) else list(data_ia)
        data_list_ib = data_ib.tolist() if isinstance(data_ib, np.ndarray) else list(data_ib)
        data_list_ic = data_ic.tolist() if isinstance(data_ic, np.ndarray) else list(data_ic)
        data_list_uab = data_uab.tolist() if isinstance(data_uab, np.ndarray) else list(data_uab)
        data_list_ubc = data_ubc.tolist() if isinstance(data_ubc, np.ndarray) else list(data_ubc)
        data_list_uca = data_uca.tolist() if isinstance(data_uca, np.ndarray) else list(data_uca)
        data_list_ua = data_ua.tolist() if isinstance(data_ua, np.ndarray) else list(data_ua)
        data_list_ub = data_ub.tolist() if isinstance(data_ub, np.ndarray) else list(data_ub)
        data_list_uc = data_uc.tolist() if isinstance(data_uc, np.ndarray) else list(data_uc)
        
        
        
        # 转换为Python列表
        # data_list = data_ib.tolist() if isinstance(data_ib, np.ndarray) else list(data_ib)
        
        return {
            "success": True,
            "data_ia": data_list_ia,
            "data_ib": data_list_ib,
            "data_ic": data_list_ic,
            "data_uab": data_list_uab,
            "data_ubc": data_list_ubc,
            "data_uca": data_list_uca,
            "data_ua": data_list_ua,
            "data_ub": data_list_ub,
            "data_uc": data_list_uc,
            "length": len(data_list_ia),
            "min": float(np.min(data_ia)),
            "max": float(np.max(data_ia)),
            "mean": float(np.mean(data_ia))
        }
        
    except Exception as e:
        return {
            "success": False,
            "error": str(e)
        }

if __name__ == "__main__":
    # 从命令行参数获取输入
    if len(sys.argv) >= 4:
        file_path = sys.argv[1]
        group_name = sys.argv[2]
        # channel_name = sys.argv[3]
        
        result = parse_tdms_file(file_path, group_name)
        print(json.dumps(result, ensure_ascii=False))
    else:
        print(json.dumps({
            "success": False,
            "error": "参数不足,需要文件路径、组名和通道名"
        }))

node代码:

复制代码
const path = require("path");
const { spawn } = require("child_process");

// 解析TDMS文件
// 解析TDMS文件的API
router.get("/tdms_data", async (req, res) => {
  try {
    const { group = "采集数据" } = req.query;

    // 调用Python脚本
    const pythonProcess = spawn("python", [
      "E:\\project\\***\\***\\parse_tdms.py",
      "E:\\project\\***\\***\\test_ac.tdms",
      group,
    ]);

    let output = "";
    let errorOutput = "";

    // 收集标准输出
    pythonProcess.stdout.on("data", (data) => {
      output += data.toString();
    });

    // 收集错误输出
    pythonProcess.stderr.on("data", (data) => {
      errorOutput += data.toString();
    });

    // 处理进程结束
    pythonProcess.on("close", (code) => {
      if (code === 0) {
        try {
          const result = JSON.parse(output);
          res.json({
            success: true,
            code: 20000,
            data: result,
            message: "解析TDMS文件成功",
          });
        } catch (parseError) {
          res.status(500).json({
            code:20001,
            success: false,
            error: `解析Python输出失败: ${parseError.message}`,
            rawOutput: output,
          });
        }
      } else {
        res.status(500).json({
          code:20001,
          success: false,
          error: `Python脚本执行失败 (退出码: ${code})`,
          pythonError: errorOutput,
        });
      }
    });
  } catch (error) {
    res.status(500).json({
      code:20001,
      success: false,
      error: error.message,
    });
  }
});

vue代码:

复制代码
 parseTdms() {
            this.listLoading = true
            parseTdmsDo(this.device_name).then(response => {
                    if(response.success&&response.data.success){
                        const llength=response.data.length;
                        this.timeData = Array.from({ length: llength }, (_, i) => i)

                        this.iaData =response.data.data_ia;
                        this.ibData =response.data.data_ib;
                        this.icData =response.data.data_ic;
                        this.uabData =response.data.data_uab;
                        this.ubcData =response.data.data_ubc;
                        this.ucaData =response.data.data_uca;
                        this.uaData =response.data.data_ua;
                        this.ubData =response.data.data_ub;
                        this.ucData =response.data.data_uc;
                        console.log("更新了数据!!")
                        this.updateChartIa()
                        this.updateChartIb()
                        this.updateChartIc()
                        this.updateChartUab()
                        this.updateChartUbc()
                        this.updateChartUca()
                        this.updateChartUa()
                        this.updateChartUb()
                        this.updateChartUc()
                        
                    }

                this.listLoading = false
            }).catch(error => {
                console.error('API调用失败:', error)
                this.listLoading = false
                this.$message({
                    message: 'API调用失败,请检查网络连接',
                    type: 'error',
                    duration: 5 * 1000
                })
            })
        },

vue的api:

复制代码
// 获取tdms数据
export function parseTdmsDo(device_name) {
  return request({
    url: '/vue-element-admin/device/tdms_data',
    method: 'get',
    params: { device_name }
  })
}

展示:

相关推荐
idwangzhen2 小时前
2026郑州GEO优化哪个平台靠谱
python·信息可视化
玉梅小洋2 小时前
Linux中 cd命令进入以 - 开头的目录报错及解决方法
linux·运维·服务器
努力努力再努力wz2 小时前
【Linux网络系列】:打破 HTTP 明文诅咒,在Linux 下用 C++ 手搓 HTTPS 服务器全过程!(附实现源码)
linux·服务器·网络·数据结构·c++·http·https
m0_737539372 小时前
iSCSI 服务器
运维·服务器
济6172 小时前
linux 系统移植(第二十一期)---- 完善BusyBox构建的根文件系统---- Ubuntu20.04
linux·运维·服务器
计算机毕业编程指导师2 小时前
【Python大数据选题】基于Hadoop+Spark奥运会金牌榜可视化分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
大数据·hadoop·python·计算机·spark·毕业设计·奥运会金牌
历程里程碑2 小时前
Linux 9:GCC编译全流程详解
linux·运维·服务器·c语言·笔记·编辑器·vim
hhcgchpspk2 小时前
python实现音频淡入淡出功能
python·程序人生·音视频·pygame
曲幽2 小时前
FastAPI异步多线程:从踩坑到精通,解锁高性能API的正确姿势
python·flask·fastapi·web·thread·async·httpx·asyncio