繁体   English   中英

将字典中的值写入 Python 中的 CSV

[英]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-"
                }]

        },

我想创建一个 CSV 文件,如下所示: CSV

关于如何实现这一目标的任何线索? 提前致谢。

您可以在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_nameid变为message_id 一旦重命名它,它使用del关键字从dict中删除键值对。 然后,对于当前signal dict中的所有键值对,它将它们分配给temp 最后,它会删除您未在屏幕截图中显示的字段,然后将temp dict写入文件

逗号分隔值 (csv) 文件的性质是一个用逗号分隔某个值的长字符串。

  1. 创建一个用值分隔的字符串
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))
  1. append 字符串到 csv 文件
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM