使用 python 有效地将数据导出到 CSV

Posted

技术标签:

【中文标题】使用 python 有效地将数据导出到 CSV【英文标题】:Export data efficiently to CSV using python 【发布时间】:2019-11-25 17:25:37 【问题描述】:

我正在使用我的 arduino 分析模拟输入,我正在使用 pyfirmata 库访问 arduino,并且我使用我的 arduino Uno 上的 6 个模拟输入来测量电压。我需要找到一种方法来有效地将这些数据实时输入到 CSV...我不确定最好的方法

任何建议都会有所帮助,但请写出您建议的代码。如果可能的话,我更喜欢使用 Pandas,因为它更容易

从电压 0 到电压 5 是我的变量,我正在尝试以一种很好的格式报告这些变量,以后必须对其进行分析

import time
from datetime import datetime
import pyfirmata
import pandas as pd

board = pyfirmata.Arduino('/dev/ttyACM1')

analog_pin0 = board.get_pin('a:0:i')
analog_pin1 = board.get_pin('a:1:i')
analog_pin2 = board.get_pin('a:2:i')
analog_pin3 = board.get_pin('a:3:i')
analog_pin4 = board.get_pin('a:4:i')
analog_pin5 = board.get_pin('a:5:i')

it = pyfirmata.util.Iterator(board)
it.start()

analog_pin0.enable_reporting()
analog_pin1.enable_reporting()
analog_pin2.enable_reporting()
analog_pin3.enable_reporting()
analog_pin4.enable_reporting()
analog_pin5.enable_reporting()

data = []

count = 0
x = 0
start = 0

while x <= 1000:

reading0 = analog_pin0.read()
if reading0 != None:
    voltage0 = reading0 * 5
    voltage0 = round(voltage0,2)
else:
    voltage0 = float('nan')
reading1 = analog_pin1.read()    
if reading1 != None:
    voltage1 = reading1 * 5
    voltage1 = round(voltage1,2)
else:
    voltage1 = float('nan')
reading2 = analog_pin2.read()
if reading2 != None:
    voltage2 = reading2 * 5
    voltage2 = round(voltage2,2)
else:
    voltage2 = float('nan')
reading3 = analog_pin3.read()    
if reading3 != None:
    voltage3 = reading3 * 5
    voltage3 = round(voltage3,2)
else:
    voltage3 = float('nan')
reading4 = analog_pin4.read()
if reading4 != None:
    voltage4 = reading4 * 5
    voltage4 = round(voltage4,2)
else:
    voltage4 = float('nan')
reading5 = analog_pin5.read()    
if reading5 != None:
    voltage5 = reading5 * 5
    voltage5 = round(voltage5,2)
else:
    voltage5 = float('nan')

datarow = 'Voltage0': voltage0, 'Voltage1': voltage1, 'Voltage2' : voltage2, 'Voltage3': voltage3, 'Voltage4' : voltage4, 'Voltage5' : voltage5, 'Time' : time.strftime("%Y-%m-%d_%H:%M:%S")
data.append(datarow)

if count%500 == 0:
    dataframe = pd.DataFrame(data)
    dataframe.to_csv('data.csv')

x += 1
count += 1

#time.sleep(1)enter code here

【问题讨论】:

您现在的 CSV 输出有什么问题? 使用块大小会有所帮助。 chunk_size 【参考方案1】:

您的代码似乎有效,但效率不高。每 500 次迭代,您重写所有数据,而不是最终用新数据更新文件。您可以考虑以这种方式保存它:

if count%500 == 0:
    dataframe = pd.DataFrame(data)
    dataframe.to_csv('data.csv',mode='a',header=False)
    data = []

如果仍然不够快,您可以考虑将数据保存为二进制格式,例如.npy(numpy 格式),然后再转换为 csv。

【讨论】:

以上是关于使用 python 有效地将数据导出到 CSV的主要内容,如果未能解决你的问题,请参考以下文章

有效地将数据从 CSV 读取到具有多个分隔符的数据框中

如何有效地将 Postgres 数据从 Query 传输到 S3

python回归预测数据怎么导出?

在 C# 中有效地将数据插入 MySQL 中的多个表中

用于访问 csv 文件中的值并使用 wamp 将其存储到数据库中的 python 程序

如何将数据从Python导出到.csv文件?