如何解决无法从python写入CSV文件
我一直在尝试根据此代码创建一个 csv 文件,但每次都失败,我尝试了不同的方法将其放入代码中,但到目前为止没有任何效果。
我是 Python 和堆栈溢出的新手。
如果有人能解释我做错了什么会很有帮助。
在此先感谢您的帮助。
from time import sleep
import os
import sys
from bleson import get_provider,Observer,UUID16
import csv
GOVEE_BT_mac_OUI_PREFIX = "A4:C1:38"
H5075_UPDATE_UUID16 = UUID16(0xEC88)
govee_devices = {}
# ###########################################################################
FORMAT_PRECISION = ".2f"
# Decode H5075 Temperature into degrees Fahrenheit
def decode_temp_in_f(encoded_data):
return format((((encoded_data / 10000) * 1.8) + 32),FORMAT_PRECISION)
# Decode H5075 percent humidity
def decode_humidity(encoded_data):
return format(((encoded_data % 1000) / 10),FORMAT_PRECISION)
#focus here
with open('temp.csv','w',newline='') as record:
record = csv.writer(record)
record.writerow(['Device Name','Device Address','Temp','Humidity'])
def print_values(mac):
govee_device = govee_devices[mac]
print(govee_device['name'],govee_device['address'],govee_device['tempInF'],govee_device['humidity'],govee_device['battery'])
record.writerow(govee_device['name'])
# On BLE advertisement callback
def on_advertisement(advertisement):
if advertisement.address.address.startswith(GOVEE_BT_mac_OUI_PREFIX):
mac = advertisement.address.address
if mac not in govee_devices:
govee_devices[mac] = {}
if H5075_UPDATE_UUID16 in advertisement.uuid16s:
# HACK: Proper decoding is done in bleson > 0.10
name = advertisement.name.split("'")[0]
encoded_data = int(advertisement.mfg_data.hex()[6:12],16)
battery = int(advertisement.mfg_data.hex()[12:14],16)
govee_devices[mac]["address"] = mac
govee_devices[mac]["name"] = name
govee_devices[mac]["mfg_data"] = advertisement.mfg_data
govee_devices[mac]["data"] = encoded_data
govee_devices[mac]["tempInF"] = decode_temp_in_f(encoded_data)
govee_devices[mac]["humidity"] = decode_humidity(encoded_data)
govee_devices[mac]["battery"] = battery
print_values(mac)
if advertisement.RSSi is not None and advertisement.RSSi != 0:
govee_devices[mac]["RSSi"] = advertisement.RSSi
# ###########################################################################
adapter = get_provider().get_adapter()
observer = Observer(adapter)
observer.on_advertising_data = on_advertisement
try:
while True:
observer.start()
sleep(2)
observer.stop()
except KeyboardInterrupt:
try:
observer.stop()
sys.exit(0)
except SystemExit:
observer.stop()
os._exit(0)
我得到的错误是:
File "/home/pi/GoveeWatcher-master/python/goveeWatcher.py",line 37,in print_values
record.writerow(govee_device['name'])
ValueError: I/O operation on closed file.
解决方法
我很想将 CSV 写入功能放在 print_values 函数中,以便它打开文件、写入数据,然后根据观察者找到的每个值关闭文件。
例如:
#focus here
def print_values(mac):
govee_device = govee_devices[mac]
print(govee_device['name'],govee_device['tempInF'])
with open('temp.csv','a',newline='') as record:
writer = csv.DictWriter(record,fieldnames=govee_device.keys())
writer.writerow(govee_device)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。