Читать CSV и загружать данные в Elasticsearch - PullRequest
0 голосов
/ 31 мая 2018

Я перебираю строки по одной из файла 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 (chunk)

IOError: Файл не открыт для записи

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

вы можете попробовать это.Измените читатель на DictReader и json.dumps (строка).DictReader делает входные данные Python dict.И для того, чтобы в каждом цикле считывателя выполнялся цикл, просто попробуйте нажать строку

        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)
0 голосов
/ 04 июня 2018

Попробуйте массовый 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

0 голосов
/ 31 мая 2018

Проблема в том, что вы передаете file_obj в качестве параметра для json.dump, но файл открывается только для чтения.Проверьте параметр режима для функции open в этой ссылке .

Также проверьте первый параметр для функции json.dump, [row for row in reader] получает все строки в csvфайл, но, вероятно, вы просто хотите передать одну строку, поэтому параметр должен быть row.

и json.dump записывает в файл, вероятно, вы должны использовать функцию json.dumps, проверьте здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...