读取CSV并将数据上传到Elasticsearch

时间:2018-05-31 08:18:19

标签: python elasticsearch

我正在逐个迭代csv文件的行,我想将它插入到es中。我是python和弹性搜索的新手。如何转换一个csv行并将其逐个插入到es中

import csv
import json

from elasticsearch import Elasticsearch

es = Elasticsearch(
  [{'host': 'localhost', 'port': 9200}])
 print(es)


def csv_reader(file_obj, delimiter=','):
   reader = csv.reader(file_obj)
   i = 1
   results = []
   for row in reader:
    print(row)
    es.index(index='product', doc_type='prod', id=i, 
   body=json.dump([row for row in reader], file_obj))
    i = i + 1
    results.append(row)
    print(row)


 if __name__ == "__main__":
  with open("/home/Documents/csv/acsv.csv") as f_obj:
    csv_reader(f_obj)

但是我收到了这个错误:

  

追踪(最近一次呼叫最后一次):

     

文件" /home/PycharmProjects/CsvReaderForSyncEs/csvReader.py",第25行,在csv_reader(f_obj)

     

文件" /home/PycharmProjects/CsvReaderForSyncEs/csvReader.py",第17行,在csv_reader中

     

es.index(index =' product',doc_type =' prod',id = i,body = json.dump([读取行中的行],file_obj))

     

文件" /usr/lib/python2.7/json/ init .py",第190行,转储fp.write(块)

     

IOError:文件未打开以进行编写

3 个答案:

答案 0 :(得分:4)

尝试批量API。

import csv
from elasticsearch import helpers, Elasticsearch

def csv_reader(file_name):
    es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
    with open(file_name, 'r') as outfile:
        reader = csv.DictReader(outfile)
        helpers.bulk(es, reader, index="index_name", doc_type="type")

有关批量API的更多信息 https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html

答案 1 :(得分:0)

问题是您将file_obj作为json.dump的参数传递,但该文件仅在阅读时打开。检查此linkopen功能的模式参数。

同时检查json.dump函数的第一个参数,[row for row in reader]获取csv文件中的所有行,但可能你只想传递一行,所以参数应该是row

并且json.dump写入文件,可能您应该使用json.dumps函数,请检查here

答案 2 :(得分:0)

你可以尝试这个吗? 将阅读器更改为DictReader和json.dumps(行)。 DictReader使输入数据是python dict。而对于in循环阅读器中的每一行,你只需尝试推行就足够了

        es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
        print(es)

        def csv_reader(file_obj, delimiter=','):
            reader = csv.DictReader(file_obj)
            i = 1
            results = []
            for row in reader:
                print(row)
                es.index(index='product', doc_type='prod', id=i,
                         body=json.dumps(row))
                i = i + 1

                results.append(row)
                print(row)

          if __name__ == "__main__":
           with open("/home/Documents/csv/acsv.csv") as f_obj:
           csv_reader(f_obj)