【问题标题】:Python: Arrange and order data in a dictionary from Excel PandasPython:在 Excel Pandas 的字典中排列和排序数据
【发布时间】:2021-09-04 14:06:04
【问题描述】:

我可以使用 Pandas 从 Excel 文件中读取特定列。

Excel 文件:

代码:

import os

import pandas as pd

excel_file = "File.xlsx"
data = pd.read_excel(os.path.join("./", excel_file), usecols="A:B,H:I")
df = pd.DataFrame(data)
dict_data = df.to_dict(orient="dict")

dict_data 看起来像这样:

{
        "VLAN ID": {0: 100, 1: 200, 2: 300},
        "VLAN Name": {0: "MGMT", 1: "Users", 2: "Phones"},
        "Gateway": {0: "10.0.0.1", 1: "172.16.0.1", 2: "192.168.1.1"},
        "Subnet Mask": {0: "255.0.0.0", 1: "255.255.0.0", 2: "255.255.255.0"}
}

我想将dict_data 转换为如下所示:

{
    "vlans": {
        {
            "id": 100,
            "name": "MGMT",
            "ipaddr": "10.0.0.1",
            "mask": "255.0.0.0",
        },
        {
            "id": 200,
            "name": "Users",
            "ipaddr": "172.16.0.1",
            "mask": "255.255.0.0",
        },
        {
            "id": 300,
            "name": "Phones",
            "ipaddr": "192.168.1.1",
            "mask": "255.255.255.0",
        },
    }
}

那么,vlans 会被传递给一个 Jinja2 模板来创建吗?我怎样才能实现这个输出?


Jinja2 模板

{% for vlan in vlans.items() %}
vlan {{ vlan["id"] }}
 name {{ vlan["name"] }}
exit
!
interface vlan {{ vlan["id"] }}
 ip address {{ vlan["ipaddr"] }} {{ vlan["mask"] }}
 description {{ vlan["name"] }}
exit
!
{% endfor %}

神社的输出

vlan 100
 name MGMT
exit
!
interface vlan 100
 ip address 10.0.0.1 255.0.0.0
 description MGMT
exit
!
vlan 200
 name Users
exit
!
interface vlan 200
 ip address 172.16.0.1 255.255.0.0
 description Users
exit
!
vlan 300
 name Phones
exit
!
interface vlan 300
 ip address 192.168.1.1 255.255.255.0
 description Phones
exit
!

【问题讨论】:

    标签: python excel pandas jinja2 cisco


    【解决方案1】:

    似乎从 DataFrame 比 data_dict 更容易做到这一点:

    rename 将列作为新值,然后调用to_dictorient='records'

    out = {
        'vlans': df.rename(
            columns={'VLAN ID': 'id',
                     'VLAN Name': 'name',
                     'Gateway': 'ipaddr',
                     'Subnet Mask': 'mask'}
        ).to_dict(orient='records')
    }
    

    out:

    {'vlans': [{'id': 100,
                'ipaddr': '10.0.0.1',
                'mask': '255.0.0.0',
                'name': 'MGMT'},
               {'id': 200,
                'ipaddr': '172.16.0.1',
                'mask': '255.255.0.0',
                'name': 'Users'},
               {'id': 300,
                'ipaddr': '192.168.1.1',
                'mask': '255.255.255.0',
                'name': 'Phones'}]}
    

    【讨论】:

      猜你喜欢
      • 2017-06-24
      • 2015-06-26
      • 2017-02-18
      • 1970-01-01
      • 2021-04-02
      • 2018-06-03
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多