我想将通过CAN总线接收的测量数据保存在CSV文件中.除了测量数据,我还想存储一些元数据,我需要转换通过CAN接收的测量数据.

测量数据为三个轴,每个轴有1024个值.由于计时问题,我在接收数据时将数据存储在列表中,并在完成测量数据传输后存储数据.对于CAN消息的接收,我使用了python-can库.我在带有测量数据的第一条消息中接收的元数据.

我想以这样的格式将所有内容存储在一个文件中

x data y data z data meta data 1 meta data 2
x(0) y(0) z(0) 2000 3
x(1) y(1) x(1)
... ... ...
x(1022) y(1022) z(1022)
x(1023) y(1023) z(1023)

我正在努力地在第一行写入元数据和测量数据的第一个bin.在第一行写入第一个bin和元数据之后,元数据的单元格应该为空.

可能有一个简单的解决方案,但我没有用正确的关键字进行搜索.

目前,我只是使用WRITE ROW函数将完整的列表写入CSV

with open(path, 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(["x_data", "y_data", "z_data"])
    for msgData in msgBuffer:
        writer.writerow([((msgData[1] <<8) | msgData[2]), ((msgData[3] <<8) | msgData[4]) , ((msgData[5] <<8) | msgData[6])])

在这里,我正在努力只写入第一行测量数据和元数据,然后继续只写入测量数据.

推荐答案

我不完全确定您是如何获取元数据的,或者如何访问它,但是您已经说过它保存在一个变量中.出于这个答案的目的,我将假设所有元数据都在一个列表中,即metadata(例如:[2000, 3]).

现在,您只编写了一个包含数据行的头文件,但您还需要包括元数据的头文件.为了防止将来出现这种情况,您可以创建一个生成器表达式,该表达式为metadata个元素中的任何数量创建足够的列.然后,您可以将for循环更改为使用enumerate()来判断这是否是第一次迭代.如果不是,可以将metadata扩展到行中,否则可以不填任何内容:

import csv

msgBuffer = [[1, 2, 3, 4, 5, 6, 7], [7, 8, 9, 10, 11, 12, 13]]  # just example data
metadata = [2000, 3]  # just example data

with open('test.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(["x_data", "y_data", "z_data", *(f'meta data {i+1}' for i in range(len(metadata)))])
    for i, msgData in enumerate(msgBuffer):
        data = metadata if i == 0 else ['' for i in range(len(metadata))]
        writer.writerow([((msgData[1] <<8) | msgData[2]), ((msgData[3] <<8) | msgData[4]) , ((msgData[5] <<8) | msgData[6]), *data])

这将创建如下所示的CSV文件:

x_data,y_data,z_data,meta data 1,meta data 2
515,1029,1543,2000,3
2057,2571,3085,,

Python相关问答推荐

如何最好地处理严重级联的json

带有计数值的Pandas数据帧

在Python中添加期货之间的延迟

在Python中使用readline函数时如何向下行

尽管进程输出错误消息,subProcess.check_call的CalledProcess错误.stderr为无

GEKKO:已知延迟的延迟系统的参数估计

Altair -箱形图边界设置为黑色,中线设置为红色

自定义新元未更新参数

使用Beautiful Soup获取第二个srcset属性

当值是一个integer时,在Python中使用JMESPath来验证字典中的值(例如:1)

如何处理嵌套的SON?

Polars比较了两个预设-有没有方法在第一次不匹配时立即失败

在Python中处理大量CSV文件中的数据

将输入管道传输到正在运行的Python脚本中

如何记录脚本输出

如何在Python脚本中附加一个Google tab(已经打开)

OR—Tools CP SAT条件约束

对象的`__call__`方法的setattr在Python中不起作用'

创建可序列化数据模型的最佳方法

重置PD帧中的值