2017-10-11 67 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