将JSON对象数组转换为CSV-Python
我已经成功地将一个简单的JSON转换为CSV。 当文件包含JSON对象数组时,我面临一个问题。 我正在使用将JSON对象数组转换为CSV-Python,python,json,csv,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
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"}]
json.loads
函数引发异常,如下所示:
Extra data ; line 1 column 6789 (char 1234)
如何处理这些文件
编辑:
该文件使用Kinesis Firehorse刷新并推送到S3。
我正在使用lambda下载文件并加载和转换。
因此它不是一个.json文件。,因为您的文件不是有效的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文件。因为您的文件不是有效的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文件。按如下方式解析每一行:
with open('input.json') as f:
for line in f:
obj = json.loads(line)
按如下方式分析每一行:
with open('input.json') as f:
for line in f:
obj = json.loads(line)
正如tanaydin所说,失败的输入不是有效的json。它应该是这样的:
[
{
“值”:0.97,
“键1”:“值1”,
“键2”:“值2”,
“键3”:“值3”,
“图例11”:“2019-01-01T00:05:00Z”
},
{“值”:0.97,“键1”:“值1”,“键2”:“值2”,“键3”:“值3”,“键11”:“2019-01-01T00:05:00Z”},
{“值”:0.97,“键1”:“值1”,“键2”:“值2”,“键3”:“值3”,“键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)
正如tanaydin所说,失败的输入不是有效的json。它应该是这样的:
[
{
“值”:0.97,
“键1”:“值1”,
“键2”:“值2”,
“键3”:“值3”,
“图例11”:“2019-01-01T00:05:00Z”
},
{“值”:0.97,“键1”:“值1”,“键2”:“值2”,“键3”:“值3”,“键11”:“2019-01-01T00:05:00Z”},
{“值”:0.97,“键1”:“值1”,“键2”:“值2”,“键3”:“值3”,“键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)