微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法从python写入CSV文件

如何解决无法从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 举报,一经查实,本站将立刻删除。