[英]Writing values from dictionaries to CSV in Python
我正在读取 JSON 文件中字典列表中的 key: value 对。 问题是我不知道如何在 CSV 文件中写这个。 到目前为止我尝试过的代码是:
import csv
import pandas as pd
import json
from pandas.io.json import json_normalize
import pyarrow as pa
import pyarrow.parquet as pq
arxml_json = open("C:\\Users\\abc\\xyz\\parser.json")
dataList = json.load(arxml_json)
# print(Results)
csv_file = "output.csv"
csv_columns = ['message_id', 'is_extended_frame','name', 'length', 'bit_length', 'factor', 'is_big_endian','is_signed,name', 'offset', 'start_bit', 'minimum', 'maximum', 'unit', 'recv_nodes', 'val_desc']
with open(csv_file, 'w') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=csv_columns)
writer.writeheader()
for key in dataList['messages']:
id = key['id']
is_extended_frame = key['is_extended_frame']
name = key['name']
length = key['length']
for value in key['signals']:
bit_length = value['bit_length']
factor = value['factor']
is_big_endian = value['is_big_endian']
#is_float = value['is_float']
is_signed = value['is_signed']
name = value['name']
offset= value['offset']
start_bit = value['start_bit']
minimum = value['minimum']
maximum = value['maximum']
unit= value['unit']
recv_nodes = value['recv_nodes']
val_desc = value['val_desc']
Json 文件如下所示:
"messages": [
{
"id": 666,
"is_extended_frame": false,
"name": "uptime",
"length": 8,
"signals":
[{
"bit_length": 64,
"factor": 1,
"is_big_endian": true,
"is_float": true,
"is_signed": true,
"name": "uptime",
"offset": 98,
"start_bit": 40,
"minimum": 30,
"maximum": 70,
"unit": "m/s",
"recv_nodes": "none",
"val_desc": "-none-"
},{
"bit_length": 64,
"factor": 1,
"is_big_endian": true,
"is_float": true,
"is_signed": true,
"name": "uptime",
"offset": 98,
"start_bit": 40,
"minimum": 30,
"maximum": 70,
"unit": "m/s",
"recv_nodes": "none",
"val_desc": "-none-"
}]
},
关于如何实现这一目标的任何线索? 提前致谢。
您可以在json.load
调用返回的dict
内的 messages 列表中迭代所有dict
并折叠signals
列表,以便子dict
中的每个键成为整个dict
中的键,这样您就不会必须明确拉出每个属性:
with open('test.json') as arxml_json:
dataList = json.load(arxml_json)
# print(Results)
csv_file = "output.csv"
csv_columns = ['message_id', 'is_extended_frame', 'message_name', 'length', 'bit_length', 'factor', 'is_big_endian','is_signed', 'signal_name', 'offset', 'start_bit', 'minimum', 'maximum', 'unit', 'recv_nodes', 'val_desc']
with open(csv_file, 'w') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=csv_columns)
writer.writeheader()
for message in dataList['messages']:
for signals in message['signals']:
temp = {k: v for k, v in message.items() if k != 'signals'}
temp['message_name'] = temp['name']
temp['message_id'] = temp['id']
del temp['name']
del temp['id']
for key, value in signals.items():
if key == 'name':
temp['signal_name'] = value
else:
temp[key] = value
del temp['is_float'] # don't care about this field
print(temp)
writer.writerow(temp)
首先,遍历 JSON 中的所有消息,然后遍历message['signals']
中所有可能的dict
。 在对signals
的每次迭代期间, temp
最初创建为message
字典的副本,不包括signals
list
,因为我们希望将这些项目复制到list
之外。 然后,它根据屏幕截图中的要求重命名一些属性:顶级中的name
变为message_name
, id
变为message_id
。 一旦重命名它,它使用del
关键字从dict
中删除键值对。 然后,对于当前signal
dict
中的所有键值对,它将它们分配给temp
。 最后,它会删除您未在屏幕截图中显示的字段,然后将temp
dict
写入文件
逗号分隔值 (csv) 文件的性质是一个用逗号分隔某个值的长字符串。
data_to_write = []
data_to_write.append("id_no")
data_to_write.append("is_extended_frame_bool")
# and so on
# join all the content in the data_to_write_list to one long string
string_to_append = ",".join(map(str,data_to_write))
output_file_name = "mydata.csv"
with open(output_file_name,"a") as file_object:
file_object.write(string_to_append +"\n")
# if "\n" not be use, it will become a long line
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.