向CSV写入光伏逆变器数据时遇AttributeError问题求助
问题排查与修正
错误直接原因
你代码里的datos = json.dump(inverter, f)是完全错误的操作:
json.dump()的作用是把字典转换成JSON格式写入文件,它本身返回None,所以datos就是None。- 当你把None传给
writer.writerow()时,DictWriter会尝试读取这个对象的keys属性来匹配表头,但None没有这个属性,直接触发AttributeError。
其他关键问题
除了上面的直接错误,代码还有几个明显问题:
- 初始循环触发KeyError:一开始
inverter是空字典,直接访问inverter['DCV_1']会报错,因为这个键不存在。 - 重复写入表头:每次打开文件追加都调用
writer.writeheader(),会导致CSV文件里每一行数据前都重复出现表头,完全不符合CSV格式规范。 - 冗余的JSON操作:
csv.DictWriter可以直接处理字典数据,不需要用JSON模块转格式,这会导致CSV文件同时混有JSON和CSV格式的内容,文件彻底混乱。
修正后的代码
import csv import time # 定义CSV表头 headers = ['ACW', 'ACA', 'ACV', 'PEAK_POW', 'DCV_1', 'DCA_1', 'DCW', 'AC_EFFI', 'LINEA_DISTR'] file_csv = "huawei.csv" # 首次运行时写入表头(仅文件不存在时执行) try: with open(file_csv, 'r') as f: pass except FileNotFoundError: with open(file_csv, 'w', newline='') as f: writer = csv.DictWriter(f, fieldnames=headers) writer.writeheader() # 持续每5秒获取并写入数据 while True: # -------------------------- # 替换成你从逆变器获取数据的代码 # 确保inverter是符合格式的字典 # 示例模拟数据: # inverter = {'ACW': 1431, 'ACA': 6.066, 'ACV': 237.2, 'PEAK_POW': 1.853, 'DCV_1': 192.2, 'DCA_1': 7.72, 'DCW': 1461, 'AC_EFFI': 97.91, 'LINEA_DISTR': 1033} # -------------------------- # 验证数据有效性(避免空字典或无效值) if isinstance(inverter, dict) and inverter.get('DCV_1', 0) >= 0: with open(file_csv, 'a', newline='') as f: writer = csv.DictWriter(f, fieldnames=headers) # 直接写入字典数据 writer.writerow(inverter) # 每5秒执行一次 time.sleep(5)
修正说明
- 移除了无用的
json模块,直接用DictWriter处理字典数据。 - 先判断文件是否存在,仅在首次运行时写入一次表头,避免重复。
- 改用
while True循环配合time.sleep(5),实现每5秒获取一次数据的需求。 - 用
inverter.get('DCV_1', 0)避免KeyError,同时增加了字典类型校验,确保写入的数据格式正确。 - 原代码的
while inverter['DCV_1'] < 0逻辑大概率有问题(光伏直流电压不可能为负),这里调整为当数据有效时写入,你可以根据实际需求修改判断条件。
内容的提问来源于stack exchange,提问作者Karendon seisysiete
相关产品推荐
相关产品推荐

