Keithley数字万用表采集电阻数据追加写入CSV不覆盖的Python实现问询
Keithley多通道电阻实时采集存储程序实现
代码调整方向
针对现有代码的问题,直接对齐需求做以下修正:
- 替换原有的硬编码字符串切片提取通道值的逻辑:原方法只要测量值的小数位数变化,就会出现提取错位,改用按CSV字段规则分割后提取测量值的方式,稳定性大幅提升
- 把文件写入模式从覆盖写改为追加写:首次启动时自动判断文件状态,只在文件为空时写入一次简化表头,后续每次采集的结果直接追加到文件末尾,完全不覆盖历史数据
- 增加固定60秒间隔的采集循环,实现每分钟1次的采集频率,全程去掉冗余的时间戳字段,输出格式完全匹配预期表格
完整可运行代码
import py2700 as DMM import time import os # 建立万用表连接 my_multimeter = DMM.Multimeter('TCPIP::169.254.69.212::1394::SOCKET') time.sleep(5) my_multimeter.set_timeout(100000) # 配置5个测量通道为电阻模式 my_multimeter.define_channels( [101, 102, 103, 104, 105], DMM.MeasurementType.resistance() ) my_multimeter.setup_scan() # 配置输出文件与简化表头 output_path = "resistance_measure.csv" file_header = "Channel 1,Channel 2,Channel 3,Channel 4,Channel 5\n" # 首次运行时初始化文件写入表头,避免后续重复写表头 if not os.path.exists(output_path) or os.path.getsize(output_path) == 0: with open(output_path, "w", encoding="utf-8") as f: f.write(file_header) # 启动采集循环 while True: # 执行单次全通道扫描 scan_res = my_multimeter.scan(time.time_ns()/(10**9)) # 解析返回的行数据:按逗号分割后,奇数位索引为电阻值,偶数位为对应时间戳 row_content = scan_res.make_csv_row().strip().split(",") res_values = [row_content[idx] for idx in range(1, len(row_content), 2)] # 拼接成单行测量数据 data_row = ",".join(res_values) + "\n" # 追加写入文件 with open(output_path, "a", encoding="utf-8") as f: f.write(data_row) # 间隔60秒采集下一组数据 time.sleep(60)
实际运行效果
- 输出的CSV文件打开后自动形成规范表格,每一行对应一次测量的5个通道电阻值,无冗余时间字段
- 程序重启后不会覆盖原有历史数据,只会在文件末尾继续追加新的测量结果
- 通道值提取完全适配测量值的长度变化,不会因为电阻值小数位增减出现错位
原代码中对返回字符串直接做步长切片的方式(如list1[0::2])本质是按字符位置隔位取数,完全无法正确提取通道值,新的解析逻辑完全规避了这个问题
内容的提问来源于stack exchange,提问作者phoenix112358
相关产品推荐
相关产品推荐

