当前位置: 首页 > news >正文

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 } }) }

展示:

http://www.jsqmd.com/news/309250/

相关文章:

  • 2026执业药师考试资料推荐:高口碑实力榜推荐,测评对比全解析!
  • 3.3 xue
  • 执业药师考试资料推荐,这份推荐清单实力榜够靠谱!
  • 科普MB、mb、KB、GB、TB、KiB
  • 2026执业药师考试辅导班推荐:备考“宝藏”网课推荐,口碑与实力兼具
  • 2026执业药师考试辅导班推荐:三大执业药师网课深度解析,靠谱之选一目了然
  • 2026执业药师考试辅导班推荐:这份实力榜推荐,助考生一次过关!
  • # 2026年法律AI工具深度测评:智律云vs无讼vs法狗狗,谁最值得买?
  • 户外探险新利器:用照片to谷歌地球记录我的荒野足迹
  • 城市规划新方法:用照片to谷歌地球构建三维现状调研
  • 告别“救火队”,迈向高效终端管理:现代与传统模式的差异思考
  • 2026年CMDB选型对比指南:哪款产品能在复杂运维需求中脱颖而出?
  • 2026自动化运维选型风向标:聚焦全场景自动化,筑牢业务合规与稳定防线
  • 从 “工具整合” 到 “数据协同”:破解研发 - 办公数据孤岛的国产DevOps平台选型策略
  • 车载USB端口ESD管耐温与防护难两全?
  • oc_lf ldo sim
  • 基因组模型调研和选型
  • 执医考试资料哪家好?一起来看看阿虎医考“黑白组合卷”
  • 2026年重庆全屋定制木质家具品牌TOP5推荐榜单
  • 2026中医执医冲刺,你的刷题软件选对了吗?
  • ChatGPT引用马斯克AI生成的Grokipedia是否陷入“内容陷阱“?
  • Instagram漏洞曝光:未授权访问私密帖文风险解析
  • 文化认同的生成论重构:从实体归属到矩阵调谐的范式转换
  • 生成式交通治理:基于生成论哲学的路网节点“语法”错乱诊断与过程调控范式
  • 立体仓库“数字堆垛”:重力仿真让货架承重利用率提12%
  • 内网横向——VulnStack-2靶场万字详细解析教程(MSF渗透,黄金票据利用)
  • 掌握这25条小贴士,快速提升数据可视化能力!
  • 三款执医技能刷题APP,谁是你的备考利器?
  • 基因组模型中,Ker分词相比BPE
  • 深渊、草图与回响:智能时代文明养护的三重奏