【问题标题】:How to convert list of jsons in a nested list of jsons to csv in python?如何将嵌套的json列表中的json列表转换为python中的csv?
【发布时间】:2022-01-06 16:56:34
【问题描述】:

如何将 json 嵌套列表中的 json 列表 转换为以下格式?似乎无法做到这一点,许多示例使用pandas,而我更喜欢使用csv.DictWriter。我的想法是(循环)读取 json - 在本例中为 data,将其转置为水平。

{"rows": [
        {
          "data": [
            {
              "A": "1",
              "B": "2"
            },
            {
              "C": "3",
              "D": "4"
            },
            {
              "E": "5",
              "F": "6"
            }
          ]
        },
       ...
       ...
       ...
        {
          "data": [
            {
              "A": "7",
              "B": "8"
            },
            {
              "C": "9",
              "D": "10"
            },
            {
              "E": "11",
              "F": "12"
            }
          ]
        }
]
}

所需格式:

A, B, C, D, E, F
1, 2, 3, 4, 5, 6
...
7, 8, 9, 10, 11, 12

我已经使用json.loads 阅读了 json。只是坚持转换这个位。

【问题讨论】:

  • 真的有一个 A,B 的 subdict 和另一个 C,D 的 subdict =
  • 是的,有@FloLie
  • 我建议使用for 循环。

标签: python json csv


【解决方案1】:

DictWriter 使用 dict 理解来生成行数据非常简单:

import json
import csv

json_str = '''{"rows": [{"data": [{"A": "1", "B": "2"},
                                  {"C": "3", "D": "4"},
                                  {"E": "5", "F": "6"}]},
                        {"data": [{"A": "7", "B": "8"},
                                  {"C": "9", "D": "10"},
                                  {"E": "11", "F": "12"}]}]}'''

data = json.loads(json_str)
with open('out.csv','w',newline='') as f:
    w = csv.DictWriter(f,fieldnames='ABCDEF')
    w.writeheader()
    for row in data['rows']:
        data = {k:v for d in row['data'] for k,v in d.items()}
        print(data)
        w.writerow(data)

输出(dict理解结果):

{'A': '1', 'B': '2', 'C': '3', 'D': '4', 'E': '5', 'F': '6'}
{'A': '7', 'B': '8', 'C': '9', 'D': '10', 'E': '11', 'F': '12'}

out.csv:

A,B,C,D,E,F
1,2,3,4,5,6
7,8,9,10,11,12

【讨论】:

    【解决方案2】:

    你最好不要做任何花哨的事情。只需遍历字典并将数据复制到新字典中即可。

    json_input = {}  # Your input JSON dictionary
    transposed_data = {}
    for row in json_input['rows']:
        for data_dict in row['data']:
            for key, value in data_dict.items():
                if key not in transposed_data:
                    transposed_data[key] = []
                transposed_data[key].append(value)
    

    然后你可以写出你认为合适的数据。例如:

    keys = transposed_data.keys()
    num_values_per_key = len(transposed_data[keys[0]])
    with open('output.csv', 'w') as output_file:
        output_file.write(f'{", ".join(keys)}\n')
        for index in range(num_values_per_key):
            values = []
            for key in keys:
                values.append(transposed_data[key][index])
            output_file.write(f'{", ".join(values)}\n')
    

    某些库提供程序也可能是制作 CSV 的更好方法。我没有在这里花太多时间,因为听起来转调是主要问题。

    【讨论】:

      【解决方案3】:

      仅仅因为它是可能的方式,我还想展示列表理解的方式。我通常非常喜欢“pythonic 方式”的做事方式,但是在这种情况下它确实有点混乱。

      import json      
      import pandas as pd
      json_data = '''{"rows": [
              {
                "data": [
                  {
                    "A": "1",
                    "B": "2"
                  },
                  {
                    "C": "3",
                    "D": "4"
                  },
                  {
                    "E": "5",
                    "F": "6"
                  }
                ]
              },
              {
                "data": [
                  {
                    "A": "7",
                    "B": "8"
                  },
                  {
                    "C": "9",
                    "D": "10"
                  },
                  {
                    "E": "11",
                    "F": "12"
                  }
                ]
              }
      ]
      }'''
                
      raw_data = json.loads(json_data)                  
                        
      cleaned_data = [{key:val for subdict in row for key,val in subdict.items()} for row in [data["data"] for data in raw_data["rows"]]]
      
      Out[118]: 
      [{'A': '1', 'B': '2', 'C': '3', 'D': '4', 'E': '5', 'F': '6'},
       {'A': '7', 'B': '8', 'C': '9', 'D': '10', 'E': '11', 'F': '12'}]
      
      df = pd.DataFrame(cleaned_data)
      
      Out[120]: 
         A  B  C   D   E   F
      0  1  2  3   4   5   6
      1  7  8  9  10  11  12
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        • 2020-02-17
        • 1970-01-01
        • 2022-08-21
        • 2019-07-21
        • 2018-10-27
        • 2021-05-17
        相关资源
        最近更新 更多