将JSON对象数组转换为CSV-Python

时间:2019-02-01 10:46:37

标签: python json csv

我已成功将简单的JSON转换为CSV。 当文件包含JSON对象数组时,我遇到了问题。 我正在使用csv模块而不是pandas进行转换。 请参考下面的内容,这些内容正在成功处理,而失败:

成功(当文件包含json对象的单个列表/数组时):

[{"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"}]

失败:

[{"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"}]
[{"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"}]
[{"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"}]

json.loads函数引发异常,如下所示:

Extra data ; line 1 column 6789 (char 1234)

如何处理此类文件?

编辑: 使用Kinesis Firehorse刷新此文件并将其推送到S3。 我正在使用lambda下载文件并加载并进行转换。 因此它不是 .json 文件。

3 个答案:

答案 0 :(得分:4)

按如下方式解析每一行:

with open('input.json') as f:
    for line in f:
        obj = json.loads(line)

答案 1 :(得分:1)

因为您的文件不是有效的JSON。您必须逐行阅读文件,然后将每一行分别转换为对象。

或者,您可以像这样转换文件结构...

[
  {
    "value": 0.97,
    "key_1": "value1",
    "key_2": "value2",
    "key_3": "value3",
    "key_11": "2019-01-01T00:05:00Z"
  },
  {
    "value": 0.97,
    "key_1": "value1",
    "key_2": "value2",
    "key_3": "value3",
    "key_11": "2019-01-01T00:05:00Z"
  },
  {
    "value": 0.97,
    "key_1": "value1",
    "key_2": "value2",
    "key_3": "value3",
    "key_11": "2019-01-01T00:05:00Z"
  }
]

,它将是有效的JSON文件。

答案 2 :(得分:0)

正如tanaydin所说,您输入的失败是无效的json。它应该看起来像这样:

[
    {
        "value":0.97,
        "key_1":"value1",
        "key_2":"value2",
        "key_3":"value3",
        "key_11":"2019-01-01T00:05:00Z"
    },
    {"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"},
    {"value":0.97,"key_1":"value1","key_2":"value2","key_3":"value3","key_11":"2019-01-01T00:05:00Z"}
]

我假设您通过遍历对象列表并在每个对象上调用json.dumps来创建json输出。您应该创建词典列表,然后在整个列表上调用json.dumps

list_of_dicts_to_jsonify = {}
object_attributes = ['value', 'key_1', 'key_2', 'key_3', 'key_11']
for item in list_of_objects:
    # Convert object to dictionary
    obj_dict = {}
    for k in object_attributes:
        obj_dict[k] = getattr(item, k) or None
    list_of_dicts_to_jsonify.append(obj_dict)

json_output = json.dumps(list_of_dicts_to_jsonify)