【问题标题】:Convert Array of JSON Objects to CSV - Python [duplicate]将 JSON 对象数组转换为 CSV - Python [重复]
【发布时间】:2019-02-01 10:46:36
【问题描述】:

我已成功将简单的 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 文件。

【问题讨论】:

    标签: python json csv


    【解决方案1】:

    像这样解析每一行:

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

    【讨论】:

      【解决方案2】:

      因为您的文件不是有效的 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 文件。

      【讨论】:

        【解决方案3】:

        正如 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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-03
          • 2020-02-06
          • 2015-04-21
          • 2018-10-11
          • 1970-01-01
          • 1970-01-01
          • 2018-01-31
          • 2011-11-16
          相关资源
          最近更新 更多