我正在逐个迭代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:文件未打开以进行编写
答案 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
的参数传递,但该文件仅在阅读时打开。检查此link中open
功能的模式参数。
同时检查json.dump
函数的第一个参数,[row for row in reader]
获取csv
文件中的所有行,但可能你只想传递一行,所以参数应该是row
。
并且json.dump
写入文件,可能您应该使用json.dumps
函数,请检查here
答案 2 :(得分:0)
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)