【发布时间】:2022-01-25 05:03:55
【问题描述】:
我正在尝试创建一个将 json 解析为 csv 格式的脚本。我在 python 中创建了一个脚本,该脚本只有在对象中存在所有键时才能正常工作。如果某些对象中的某些键不可用,则代码将被破坏。如果我添加 try catch 而不是脚本跳过 feild 值而不是为相同的键创建空值(如果不存在)。
下面的脚本不适用于下面的 json,因为 json first_name 和 last_name .. etc 包含不存在于其他列表中或仅存在于第一个索引处的 dict。 json在下面的路径上如下
https://github.com/david8981/sample-data/blob/main/data1.json
下面是python代码
import json
import csv
def parse_from_list(json_list, output_path):
# Grab field names
field_names = []
for key in json_list[0].keys():
current_key_list = set()
found_list = False
for obj in json_list:
if isinstance(obj[key], dict):
found_list = True
for subkey in obj[key]:
current_key_list.add(subkey)
if found_list:
field_names.extend(['%s|||---|||%s' % (key, x) for x in list(current_key_list)])
else:
field_names.append(key)
# Loop through objects and grab out data
json_data = []
for obj in json_list:
new_data = {}
for field in field_names:
new_value = ''
if '|||---|||' in field:
if field.split('|||---|||')[0] in obj and field.split('|||---|||')[1] in obj[field.split('|||---|||')[0]]:
new_value = obj[field.split('|||---|||')[0]][field.split('|||---|||')[1]]
else:
if field in obj:
new_value = obj[field]
new_data[field.replace('|||---|||', '_')] = new_value
json_data.append(new_data)
keys = json_data[0].keys()
with open(output_path, 'w', newline='') as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
dict_writer.writerows(json_data)
pass
parse_from_list(json.load(open('data.json', 'rb'))['data']['items'], 'output.csv')
代码在以下 json 中运行良好
https://github.com/david8981/sample-data/blob/main/data2.json
【问题讨论】:
-
csv.DictWriter()应该处理丢失的键,并为它们写空字段。 -
是的,但如果某些字典中不存在键,则无法解析 json,因为您可以检查第一个 json 文件是否代码不起作用。其次它正在生成 csv 文件
-
如果您有一组已知的列,那么您可以使用该已知集而不是
keys = json_data[0].keys()。然后在定义csv.DictWriter()时包含extrasaction参数 -
您好,devid,您可以尝试使用可管理的输入数据来解决问题吗?也许提供一个较小的输入 json 样本,只有几个条目和该样本的预期输出?如此庞大的输入数据很难得到清晰的结果。