将csv文件数据导入Influxdb

时间:2017-04-03 13:37:10

标签: python csv influxdb

是否可以将csv文件数据推送到Influxdb。例如,我有一个传感器设备,每分钟更新数据到csv文件。我需要对它做一些操作。 我需要将csv文件数据推送到Influxdb,为此我正在编写一个python脚本。 我试图找到一些例子,但无法找到任何成功。在我的python脚本下面只有读取csv文件代码,这很简单,但没有代码如何将此csv传递给流入数据库。我正在尝试的我的csv文件和代码看起来像这样。

DATE,value
2017-03-23 11:50:38,16
2017-03-23 11:50:44,83
2017-03-23 11:50:50,16
2017-03-23 11:50:56,70
2017-03-23 11:51:02,96

,代码是

import datetime
import random
import time
import os
import csv
from csv import reader
import argparse
from influxdb import client as influxdb


db = influxdb.InfluxDBClient(host, 8086, rob, xxxx, sensors_data)


def read_data(filename):
    with open(filename) as f:
        reader = f.readlines()[1:]
        for line in reader:
            print line


if __name__ == '__main__':
    filename = '/home/rob/myfile.csv'
    a = read_data(filename)

我发现这个链接但它的不同并不符合我的要求。 http://coendegroot.com/grafana-influxdb-and-python-simple-sample/ 我可以读取这个csv文件,现在我需要将csv文件数据发送到流入数据库。但我不知道如何处理python脚本。我试图找到例子,但没有成功。如果有人指导我,我将非常感激。 thanx很多

我根据Pigueiras建议更改了代码,它看起来像这样

import datetime
import random
import time
import os
import csv
from csv import reader
import argparse
from influxdb import client as influxdb


db = influxdb.InfluxDBClient(host, 8086, rob, xxxx, sensors_data)
def read_data():
    with open('file.csv') as f:
        return [x.split(',') for x in f.readlines()[1:]]

a = read_data()

for metric in a:
    influx_metric = [{
        'measurement': 'your_measurement',
        'time': a[0],
        'fields': {
            'value': a[1]
        }
    }]
    db.write_points(influx_metric)

我尝试了这段代码,它给了我以下错误

 'NameError: name 'your_measurement' is not defined

如果我像'测量'一样使用:'your_measurement'。然后我得到了这个错误。 .......

    File "all_flux.py", line 37, in <module>
db.write_points(influx_metric)
  File "/usr/local/lib/python2.7/dist-packages/influxdb/client.py", line 411, in write_points
tags=tags, protocol=protocol)
  File "/usr/local/lib/python2.7/dist-packages/influxdb/client.py", line 461, in _write_points
protocol=protocol
  File "/usr/local/lib/python2.7/dist-packages/influxdb/client.py", line 282, in write
data = make_lines(data, precision).encode('utf-8')
  File "/usr/local/lib/python2.7/dist-packages/influxdb/line_protocol.py", line 154, in make_lines
_convert_timestamp(point['time'], precision)
  File "/usr/local/lib/python2.7/dist-packages/influxdb/line_protocol.py", line 40, in _convert_timestamp
raise ValueError(timestamp)
ValueError: ['2017-03-23 11:50:38', '16\r\n']

DATE字段或列看起来像这样'2017-03-23 11:50:38' 所以我用return [x.split(',').... 而且我也忽略了第一行。但我得到了这个值错误

2 个答案:

答案 0 :(得分:4)

您只需构建一个JSON主体,使用从CSV中读取的数据插入Influx。小心它没有返回任何内容的read_data函数。

这样的事情应该可以正常工作(当然,可以优化它一次插入多个点):

def read_data():
    with open('file.csv') as f:
        return [x.split(',') for x in f.readlines()[1:]]

a = read_data()

for metric in a:
    influx_metric = [{
        'measurement': 'your_measurement',
        'time': metric[0],
        'fields': {
             'value': metric[1]
        }
    }]
    db.write_points(influx_metric)

答案 1 :(得分:0)

我找到了解决方案:将csv导出到influx。 https://github.com/Bugazelle/export-csv-to-influx

安装方式:pip install ExportCsvToInflux

demo.csv

timestamp,url,response_time
2019-07-11 02:04:05,https://jmeter.apache.org/,1.434
2019-07-11 02:04:06,https://jmeter.apache.org/,2.434
2019-07-11 02:04:07,https://jmeter.apache.org/,1.200
2019-07-11 02:04:08,https://jmeter.apache.org/,1.675
2019-07-11 02:04:09,https://jmeter.apache.org/,2.265
2019-07-11 02:04:10,https://sample-demo.org/,1.430
2019-07-12 08:54:13,https://sample-show.org/,1.300
2019-07-12 14:06:00,https://sample-7.org/,1.289
2019-07-12 18:45:34,https://sample-8.org/,2.876
export_csv_to_influx \
--csv demo.csv \
--dbname demo \
--measurement demo \
--tag_columns url \
--field_columns response_time \
--user admin \
--password admin \
--force_insert_even_csv_no_update True \
--server 127.0.0.1:8086