【问题标题】:How can I print out columns names in my CVS file that is exported from elastic search?如何打印从 elasticsearch 导出的 CSV 文件中的列名?
【发布时间】:2018-03-23 05:08:24
【问题描述】:

以下是从弹性搜索中获取一些数据并将该数据导出到名为“mycsvfile”的 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

如您所见,列名与查询中的相同,我想在生成文件时为它们提供可读的名称。

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

提前谢谢你

【问题讨论】:

  • 你的问题很难理解。你的意思是你对“DTDT”不满意,你想给这个列一个不同的名字,例如“日期”?
  • 正确,我想命名日期等列,抱歉造成混淆,你能编辑我的代码并告诉我怎么做吗?
  • 为了清楚起见,我已经编辑了您的问题并回答了它。
  • 我看到了,谢谢!

标签: python python-3.x csv elasticsearch python-3.6


【解决方案1】:

如果您不介意或愿意,可以尝试使用 pandas。如果您使用 pandas,您的解决方案是:

import pandas as pd

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

print(df.columns)

我还想补充一点,如果您的标题情况不同或您的索引列不存在,您可能需要对 df 创建语句进行一些调整。这是文档link

【讨论】:

  • 嗨,凯文,我刚刚尝试这样做,但没有成功。你能在我的代码中告诉我并更新你的答案吗?
  • 这不是回答问题。
  • 对不起,这是我的错。我没有正确阅读问题。首先考虑this,它是用于重命名熊猫数据框列的内置函数。在您的代码中/根据我上面的内容,尝试:df.rename(index=str, columns={'DTDT': 'datestamp', 'RPLE': 'code'}) 在您进行所需的更改后,您可以执行以下操作:pd.DataFrame.to_csv('newcsv') 在您的编辑后获取新的 csv。
【解决方案2】:

您想要重命名字典键To do that, you can for example pop it to a new column name.DTDT 更改为 date 的示例。

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

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

【讨论】:

  • 感谢您查看,我没有弄明白,我在网上使用了示例,这就是为什么我很难做到这一点重命名列名,如果你能告诉我这是怎么回事,我很合适请在我的代码中完成一个示例?
  • 这是复制和粘贴一行并更改字符串的最简单的事情之一。如果我为你做,你永远学不会。
  • 我理解并且我完全同意,但这对我来说是全新的,这就是为什么我去复制和粘贴和换行等,我已经坚持了好几天了,真的到了我想放弃的地步,因为这种编码不是我的强项。希望你能理解
【解决方案3】:

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

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

然后替换这行代码:

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

说实话,没有对此进行测试,但它应该可以完成这项工作,而且简单透明。您可能希望确保实际提供所有字段名称的翻译。

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

【讨论】:

  • 嗨,我应该把 readableColumnNames = {"DTDT" : "Date", [...]} 放在哪里?你能更新我的代码并给我看。我想我可能把它放在了错误的地方。谢谢那些有趣的字段来自我没有创建的数据库。
  • 我为此澄清了我的答案。你得到什么错误?我还稍微改变了第一行。 [...] 位是一个省略号,我希望你用一些有意义的东西来代替它。现在示例按原样运行,但您需要为所有字段名称提供翻译,否则您将收到 KeyError。
  • 我厌倦了你的建议,我把 readableColumnNames = {"DTDT" : "Date", "BLI" : "Blub"} 放在 es 行之后,然后我替换了我的行,即 - w .writerow(my_dict) 与您的行 - w = csv.DictWriter(f, [readableColumnNames[colName] for colName in my_dict.keys()])。但是它不起作用。我得到的错误是 - 文件“C:/Users/.PyCharmCE2017.2/config/scratches/test1.py”,第 30 行,在 w = csv.DictWriter(f, [readableColumnNames[colName] for colName在 my_dict.keys()])w = csv.DictWriter(f, [readableColumnNames[colName] for colName in my_dict.keys()]) KeyError: 'DF'
  • 这正是我在上一条评论中所预测的:您需要为所有字段名称提供翻译。该错误告诉您:“我无法翻译字段名称'DF'”。因此,只需扩展您的 readableColumnNames 并为所有字段名称提供翻译。
猜你喜欢
  • 2020-01-17
  • 2019-08-21
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 2012-11-04
  • 2022-11-14
相关资源
最近更新 更多