创建第一行包含测量数据和 meta数据的csv文件

hi3rlvi2  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(114)

我想将通过CAN总线接收的测量数据保存在csv文件中。除了测量数据外,我还想存储一些 meta数据,我需要转换通过CAN接收的测量数据。
测量数据是三个轴的,每个轴有1024个值。由于定时问题,我在接收数据时将其存储在列表中,并在测量数据传输完成后存储它。对于can消息的接收,我使用python-can库。我在第一个消息中接收的 meta数据与测量数据一起。
我想把所有东西都存储在一个文件中,格式如下
| x数据|y数据|z数据| meta数据1| meta数据2|
| --------------|--------------|--------------|--------------|--------------|
| x(0)|联系我们|z(0)|二千年|三|
| x(1)|y(1)|x(1)|||
| ……|……|……|||
| X(1022)|中文(简体)|Z(1022)|||
| (1023)|中文(简体)|z(1023)|||
我正在努力将 meta数据和测量数据的第一个bin写在第一行。在第一行写完第一个bin和元数据后,元数据的单元格应该是空的。
可能有一个简单的解决方案,但我没有用正确的关键字搜索。
目前,我只是用writerrow函数将完整的列表写入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])])

在这里,我正在努力编写第一行测量数据和 meta数据,然后继续编写测量数据。

kupeojn6

kupeojn61#

我不完全确定你是如何获取元数据的,或者如何访问它,但是你说过它保存在一个变量中。为了回答这个问题,我假设所有的元数据都在一个列表中,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,,

相关问题