我的CSV文件中从弹性搜索导出的可读列名称?

问题描述:

下面是从弹性搜索中获取一些数据并将该数据导出到名为'mycsvfile'的csv文件的代码。 我想更改列名以便它可以被人读取。 下面是代码:我的CSV文件中从弹性搜索导出的可读列名称?

from elasticsearch import Elasticsearch 
import csv 

es = Elasticsearch(["9200"]) 

# Replace the following Query with your own Elastic Search Query 
res = es.search(index="search", body= 
       { 
        "_source": ["DTDT", "TRDT", "SPLE", "RPLE"], 
        "query": { 
         "bool": { 
          "should": [ 
           {"wildcard": {"CN": "TEST1"}} 

          ] 
         } 
        } 
}, size=10) 



with open('mycsvfile.csv', 'w') as f: # Just use 'w' mode in 3.x 
    header_present = False 
    for doc in res['hits']['hits']: 
     my_dict = doc['_source'] 
     if not header_present: 
      w = csv.DictWriter(f, my_dict.keys()) 
      w.writeheader() 
      header_present = True 


     w.writerow(my_dict) 

当我运行上面的查询的CSV文件中的数据看起来象下面这样:

DTDT TRDT SPLE SACL RPLE 

20170512 12/05/2017 15:39 1001 0 0 

20170512 12/05/2017 15:39 1001 0 0 

20170908 08/09/2017 02:42 1001 0 0 

20170908 08/09/2017 06:30 1001 0 0 

正如你所看到的列名是相同的查询和我想在文件生成时给他们可读的名字。例如,代替DTDT,我希望DATE和TRDT是TIME等。

有人可以显示并修复我的代码,以便为CSV文件输入列名吗?

谢谢你提前

编辑:对不起,写了那条线我的背后。正确的,经过测试的版本如下。

with open('mycsvfile.csv', 'w') as f: # Just use 'w' mode in 3.x 
    header_present = False 
    for doc in res['hits']['hits']: 
     my_dict = doc['_source'] 
     if not header_present: 
      fieldnames = ['name', 'name', 'name'] 
      w = csv.DictWriter(f, fieldnames=fieldnames) 
      w.writeheader() 
      header_present = True 

     w.writerow(my_dict) 

什么让你的脚本写出头是my_dict.keys()传递给DictWriter。用一系列标签替代这些密钥,作者应该正确地写出它。

+0

我换成“w.writerow(my_dict)”与 - w.writeheader('column_name','column_name','column_name','column_name')的答案。 但我现在收到一个错误 - Traceback(最近调用最后一个): 文件“C:/Users/.PyCharmCE2017.2/config/scratches/test1.py”,第28行,在 w.writeheader ('column_name','column_name','column_name','column_name') TypeError:writeheader()需要1个位置参数,但给出5个。 是因为我得到了my.dict里面的w.writeheader? – Rich

+0

在实际阅读文档后修改了答案:) – CHURLZ

+0

感谢您的关注,我运行代码并创建了文件,但它不再抓取我的数据?代码中是否存在缺失的内容? – Rich

一个简单的方法是只用一个字典作为一个转换表,并把它写成一排,而不是编写实际DictWriter头的:

header_names = { 'DTDT': 'DATE', 'TRDT': 'TIME', ...} 

with open('mycsvfile.csv', 'w') as f: # Just use 'w' mode in 3.x 
    header_present = False 
    for doc in res['hits']['hits']: 
     my_dict = doc['_source'] 
     if not header_present: 
      w = csv.DictWriter(f, my_dict.keys()) 
      w.writerow(header_names) # will write DATE, TIME, ... in correct place 
      header_present = True 


     w.writerow(my_dict) 
+0

工作!非常感谢!你会知道如何创建我的文件名为'mycsvfile与当前日期和时间在文件名的末尾,当我运行查询名称应该是mycsvfile20121012 - 08:46 – Rich