【问题标题】:Filter JSON data into a CSV list将 JSON 数据过滤到 CSV 列表中
【发布时间】:2020-11-07 13:06:50
【问题描述】:

我的目标是从这个 JSON 文件 (output.json) 中取出主机名,并使用 python 将它们放入一个 CSV 列表 (newoutput.csv),最终结果如下所示:

主机1、主机2、主机3

有几百个条目,主机名在“specific_data.data.hostname”下

这里是 output.json 文件的 sn-p:

 [
      {
        "adapter_list_length": 3,
        "adapters": [
          ...
        ],
        "internal_id": "...",
        "labels": [
          "...",
          "..."
        ],
        "specific_data.data.hostname": [
          "TheHost1"
        ],
        "specific_data.data.last_seen": "...",
        "specific_data.data.network_interfaces.ips": [
          "...",
          "...",
          "..."
        ],
        "specific_data.data.network_interfaces.mac": [
          "..."
        ],
        "specific_data.data.os.type": [
          "..."
        ]
      },
      {
        "adapter_list_length": 3,
        "adapters": [
          "...",
          "....",
          "...",
          "..."
        ],
        "internal_id": "...",
        "labels": [
          "...",
          "Router"
        ],
        "specific_data.data.hostname": [
          "TheHost2"
        ],
        "specific_data.data.last_seen": "...",
        "specific_data.data.network_interfaces.ips": [

我是 python 新手,任何帮助都将不胜感激。

【问题讨论】:

  • 首先我会serialize json 作为python 对象。然后我会使用map 函数来提取“specific_data.data.hostname”属性的数组。然后我会使用 string.Join() 函数将其转换为 csv 字符串
  • 请发布您已经尝试过的内容以及实际问题所在。 JSON文件读取? CSV 输出写入?提取主机名? ...?
  • specific_data.data.hostname 是一个数组而不是字符串。该数组中可以有多个条目吗?我在下面发布的解决方案假定数组只有一个值。
  • 我真的不知道该尝试什么,就像我说的,我对 python 很陌生,甚至不知道从哪里真正开始。我已经保存了这个 json 文件,我只是想把它过滤掉。

标签: python json linux python-2.7 csv


【解决方案1】:

您可以迭代字典列表并使用在每条记录中找到的主机列表扩展“主机”列表。获得所有值后,构建逗号分隔的字符串。

import json
# python 2.7 needs different open
import codecs
filename = "output.json"
# json is usually utf-8 encoded but this is not 100% guaranteed
data = json.loads(codecs.open(filename, encoding="utf-8"))
hosts = []
for record in data:
    if "specific_data.data.hostname" in record:
        hosts.extend(record["specific_data.data.hostname"])
# assuming hosts are all ascii
with open("hostnames.csv", "w") as fileobj:
    fileobj.write(",".join(hosts))
    fileobj.write("\n")

【讨论】:

  • 对不起,我应该指定,我需要读取/打开文件 (output.json),进行过滤,然后将其导出为 (hostnames.csv)。我该怎么做?
  • @laser_gunns 首先请说明您的原始问题,以便其他人回答和将来参考
  • 我刚刚注意到它的python 2.7,所以需要稍微改变一下那个文件。
  • ....而 python 2.7 已经结束生命,所以升级到 3.x 时必须注意。
【解决方案2】:

以下将csv 变量设置为以逗号分隔的主机名字符串。

import json
object = json.loads(snippet)
csv = ', '.join(x['specific_data.data.hostname'][0] for x in object)

【讨论】:

    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    相关资源
    最近更新 更多