2017-10-11 64 views
1

下面是从弹性搜索中获取一些数据并将该数据导出到名为'mycsvfile'的csv文件的代码。如何打印出从弹性搜索导出的CVS文件中的列名?

我想更改列名以便它可以被人读取。

下面是代码:

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 

正如你所看到的列名是一样的查询,并且我想在生成文件时给它们可读的名称。

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

谢谢你提前

+0

你的问题很难理解。您的意思是您对“DTDT”不满意,并且您希望为此专栏指定不同的名称,例如“日期”? – Wli

+0

正确,我想命名像日期等列等抱歉的困惑,你可以编辑我的代码,并告诉我如何做到这一点? – Rich

+0

为了清晰起见,我编辑了您的问题并回答了它。 – Wli

回答

-2

如果你不介意或愿意,你可以尝试使用熊猫。如果您使用的大熊猫的解决办法是:

import pandas as pd 

df = pd.DataFrame.read_csv('mycsvfile.csv') 

print(df.columns) 

还我只是想补充一点,如果你的头的情况是不同的或者你的索引列不存在,你可能需要做出一些调整DF创建语句。这里的文档link

+0

嗨凯文,我试图做到这一点,并没有工作。你能否在我的代码中显示我并更新了你的答案? – Rich

+0

这不回答这个问题。 – Wli

+0

对不起,这是我的不好。我没有正确地阅读这个问题。 首先考虑[this](https:// pandas。pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html)它是内置的重命名大熊猫数据框列的函数。 在您的代码/根据我上面的,尝试: 'df.rename(index = str,columns = {'DTDT':'datestamp','RPLE':'code'})' 做出你想要的改变,你可以做: 'pd.DataFrame.to_csv('newcsv')' 在编辑后得到一个新的csv。 –

0

你想要的是重命名字典键To do that, you can for example pop it to a new column name.更改示例DTDT日期

my_dict['date'] = my_dict.pop('DTDT') 

我想你可以弄清楚如何重命名你的其他列。之后,您可以在for循环中调用w.writerow

+0

谢谢你看看,我没有弄清楚,我在网上使用的例子,这就是为什么我很难做到这一点重命名的列名,我相信它,如果你能告诉我如何做到这一点在我的代码请与例? – Rich

+0

这是复制和粘贴一行并更改字符串最重要的事情之一。如果我为你做,你永远不会学习。 – Wli

+0

我明白,我完全同意,但这对我来说都是新的,这就是为什么我去复制和粘贴,改变线等,我一直坚持这个好几天了,它真的到了一个点,我觉得就像放弃,因为这个编码不是我最强的一点。我希望你能理解 – Rich

0

那怎么样?在顶部定义带有翻译的字典,例如初始化您的ES客户端,上线4个或5个左右之后:

readableColumnNames = {"DTDT" : "Date", "BLI" : "Blub"} 

,然后替换这行代码:

w = csv.DictWriter(f, [readableColumnNames[colName] for colName in my_dict.keys()]) 

没考这个,说实话,但应做这项工作,而且简单透明。您可能希望确保实际提供所有字段名称的翻译。

否则,如何在Elasticsearch中使用合理的字段名称:-)?

+0

嗨,我应该在哪里把readableColumnNames = {“DTDT”:“Date”,[...]} ?.你能够更新我的代码并显示给我。我想我可能会把它放在错误的地方。谢谢那些有趣的字段来自我没有创建的数据库。 – Rich

+0

我为此澄清了我的答案。你得到的错误是什么?我也改变了第一行。该位是一个省略号,我希望你用有意义的东西来取代。现在该示例按原样运行,但您需要提供所有字段名称的翻译,否则您将得到一个KeyError。 –

+0

我厌倦了你的建议,我把你的建议放在READES行后面,然后我用你的w.writerow(my_dict)替换成你的线,然后把你的可读的COLUMNNAME = {“DTDT”:“Date”,“BLI”:“Blub”}行 - w = csv.DictWriter(f,[可读的columnNames [colName]为colName在my_dict.keys()])。但它不起作用。我得到的错误是 - 文件“C:/Users/.PyCharmCE2017.2/config/scratches/test1.py”,第30行,在 w = csv.DictWriter(f,[readableColumnNames [colName] for colName in my_dict.keys()])w = csv.DictWriter(f,[errorsColumnNames [colName] for colName in my_dict.keys()]) KeyError:'DF' – Rich