2017-10-11 29 views
0

下面是從彈性搜索中獲取一些數據並將該數據導出到名爲'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文件輸入列名嗎?

謝謝你提前

回答

1

編輯:對不起,寫了那條線我的背後。正確的,經過測試的版本如下。

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

0

一個簡單的方法是隻用一個字典作爲一個轉換表,並把它寫成一排,而不是編寫實際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