Python温度日志如何将DS18B20传感器数据按列而非行存储
DS18B20温度记录仪输出格式调整方案
核心修改逻辑
要实现「每个传感器对应单独一列、同一时间所有传感器数据放在同一行」的效果,核心是把原来单传感器单条记录的逻辑,改为单次采集周期内汇总所有传感器数据生成单条记录,同时补充CSV表头自动写入逻辑保证列对应关系。
修改后完整代码
import os import glob import time import datetime import csv # 挂载设备驱动 os.system('modprobe w1-gpio') os.system('modprobe w1-therm') class DS18B20: def __init__(self): self.base_dir = r'/sys/bus/w1/devices/28*' self.sensor_path = [] self.sensor_name = [] self.rows = [] def find_sensors(self): self.sensor_path = glob.glob(self.base_dir) self.sensor_name = [path.split('/')[-1] for path in self.sensor_path] def strip_string(self, temp_str): i = temp_str.index('t=') if i != -1: t = temp_str[i+2:] temp_c = float(t)/1000.0 return temp_c def read_temp(self): tstamp = datetime.datetime.now() # 单条记录首列为采集时间 current_row = [tstamp] for sensor, path in zip(self.sensor_name, self.sensor_path): # 读取单个传感器数据 with open(path + '/w1_slave','r') as f: valid, temp = f.readlines() # 校验数据有效性,读取失败填空值保证列对齐 if 'YES' in valid: current_row.append(self.strip_string(temp)) else: current_row.append(None) time.sleep(0.2) self.rows.append(current_row) def print_temps(self): print('-'*90) for row in self.rows: tstamp = row[0] print(f'采集时间:{tstamp}') for sensor_name, temp in zip(self.sensor_name, row[1:]): if temp is not None: print(f' 传感器 {sensor_name}:{temp:.3f}℃') else: print(f' 传感器 {sensor_name}:读取失败') def log_csv(self): file_exists = os.path.exists('log.csv') # 判断文件是否为空,决定是否写入表头 is_empty = file_exists and os.path.getsize('log.csv') == 0 with open('log.csv','a+', newline='', encoding='utf-8') as log: writer = csv.writer(log) # 首次写入先插入表头:第一列是时间,后续列对应传感器ID if not file_exists or is_empty: headers = ['采集时间'] + self.sensor_name writer.writerow(headers) writer.writerows(self.rows) def clear_rows(self): self.rows.clear() s = DS18B20() s.find_sensors() while True: s.read_temp() s.print_temps() s.log_csv() s.clear_rows() # 采集间隔在这里调整,单位为秒,可按需修改 time.sleep(100)
主要调整点
- 重构
read_temp方法:单次采集所有传感器温度,汇总为单条记录,单个传感器读取失败时自动填空值保证列对齐 - 优化
log_csv方法:新增表头自动写入逻辑,首次创建日志文件时自动生成「时间+传感器ID」的表头 - 修正延时逻辑:将原本每个传感器读取后的100秒延时移到主循环末尾,避免多传感器时采集周期异常拉长
- 适配
print_temps输出逻辑,和新的存储结构保持一致
内容的提问来源于stack exchange,提问作者qqq_ppp
相关产品推荐
相关产品推荐

