python网络自动化-数据格式与数据建模语言
数据格式
在Python网络运维自动化最基本是JSON、YAML和XML这3种数据格式。除了这3种常用的数据格式,还有一种深受网络工程师喜爱且在网络运维自动化中常用的数据承载方式——表格
需要注意的是JSON的键必须用双引号包裹,JSON的对象数据键值对的值和数组成员的值可以是JSON的object、array、string、number、true、false、null中的任意一种
JSON数据类型与Python数据类型的转化关系
SON的本质是一段文本,它对缩进、换行并不敏感。一般为了提高可读性,开发人员会适当调整JSON数据文本的缩进和换行。用JSON数据表示一台网络设备的基本信息,
在实际编写中,如果有若干台网络设备,可以将其编写到数组中。用JSON数据表示若干网络设备信息
json模块与JSON数据转换
Python内置了json模块,用于处理JSON数据与Python基础数据的相互转换。在json模块中,有json.dumps、json.dump、json.loads、json.load这4个主要的函数来实现相关的转换功能。json模块的4个函数与数据转换的关系如图
json.dumps函数
json.dumps函数的主要功能是将Python的数据对象转换为JSON数据。需要掌握以下3个参数。
• obj: Python的数据对象,这个数据对象建议使用表3-1中的Python数据类型。
• indent:缩进,默认是None,即JSON文本会以最紧凑的方式进行展示。缩进的值可以被适当调整为整数2或者4。
• ensure_ascii:是否使用ASCII编码,默认值为True。如果数据对象中含有中文,建议将此值设置为False,这样中文内容就不会被编码处理,而是以中文的字符串保存。
使用json.dumps函数将Python数据对象转换为JSON数据,如以下代码
import jsonpython_data = {'name': 'netdevops01', 'ip': '192.168.137.1','vendor': '华为', 'online': True, 'rack': '0101','start_u': 20, 'end_u': 21, 'interface_usage': 0.67,'interfaces': ['eth1/1', 'eth1/2', 'eth1/3'],'uptime': None}json_text = json.dumps(python_data, ensure_ascii=False, indent=4)
print(type(json_text))
print(json_text)
执行结果
<class 'str'>
{"name": "netdevops01","ip": "192.168.137.1","vendor": "华为","online": true,"rack": "0101","start_u": 20,"end_u": 21,"interface_usage": 0.67,"interfaces": ["eth1/1","eth1/2","eth1/3"],"uptime": null
}
2 json.dump函数
json模块提供了函数json.dump,它通过调用文件对象的write方法,可以将Python数据对象转换为JSON文本的字符串并写入文件。需要掌握json.dump函数的以下4个参数。
• obj: Python数据对象,它是第一个参数,用法与json.dumps函数的obj参数相同。• fp:将它视为可以写入的文本文件对象即可。
• indent:缩进,用法与json.dumps函数的indent参数相同。
• ensure_ascii:是否使用ASCII编码,用法与json.dumps函数的ensure_ascii参数相同。
使用json.dump函数将Python数据对象转换为JSON文本并写入文本文件,如代码
import jsonpython_data = {'name': 'netdevops01', 'ip': '192.168.137.1','vendor': '华为', 'online': True, 'rack': '0101','start_u': 20, 'end_u': 21, 'interface_usage': 0.67,'interfaces': ['eth1/1', 'eth1/2', 'eth1/3'],'uptime': None}
with open('data.json', mode='w', encoding='utf8') as f:json.dump(python_data, fp=f, ensure_ascii=True, indent=4)
成功运行代码后,在代码所在的目录中会生成一个名为data.json的文本文件。
3 json.loads函数
json.loads函数可以将JSON数据转换为Python的数据对象。json.loads函数中最重要的参数是第一个参数s(一般按位置赋值的方式传入实参),用于接收要转换的JSON文本字符串。json.loads函数将JSON数据转换为Python数据,如代码
import jsonjson_text = """{"name": "netdevops01","ip": "192.168.137.1","vendor": "huawei","online": true,"rack": "0101","start_u": 20,"end_u": 21,"interface_usage": 0.67,"interfaces": ["eth1/1","eth1/2","eth1/3"],"uptime": null
}"""
data = json.loads(json_text)
print(type(data))
print(data)
执行结果
<class 'dict'>
{'name': 'netdevops01', 'ip': '192.168.137.1', 'vendor': 'huawei', 'online': True, 'rack': '0101'’, 'start_u': 20, 'end_u': 21, 'interface_usage': 0.67, 'interfaces': ['eth1/1', 'eth1/2', 'eth1/3'], 'uptime': None}
4 json.load函数
网络运维自动化使用的JSON数据可能来源于文本文件或者网络中的一组字节流,json模块也可以将字节流直接转换为Python数据对象的函数json.load。可以将字节流简单理解为打开的文本文件对象。在使用json.load函数时,仅需关注它的第一个参数fp,即打开的文本文件对象。json.load函数将文本文件对象转换为Python数据,如代码
import jsonwith open('data.json', encoding='utf8') as f:data = json.load(fp=f)print(type(data))print(data)
执行结果
<class 'dict'>
{'name': 'netdevops01', 'ip': '192.168.137.1', 'vendor': '华为', 'online': True,
'rack': '0101', 'start_u': 20, 'end_u': 21, 'interface_usage': 0.67, 'interfaces':
['eth1/1', 'eth1/2', 'eth1/3'], 'uptime': None}
YAML规范及其使用
YAML是一种有层级且可读性非常强的数据格式,用于表示数据结构和配置信息,具有简洁、可扩展和易于理解的特点。YAML文件的扩展名有两种:一种是yaml(官方推荐的写法),另一种是yml(在DevOps中被广泛使用)。这里采用的是yml格式。用YAML数据表示一台网络设备的基本信息,如代码
device:name: netdevops01ip: 192.168.137.1vendor: 华为online: truerack: '0101'start_u: 20end_u: 21interface_usage: 0.67interfaces:- eth1/1- eth1/2- eth1/3uptime: null
YAML使用带空格的缩进来表示层级关系,且缩进没有数量上的强制要求,一般使用2个空格来表示一个缩进。从观感上而言,同层级的字段数据是左侧对齐的。YAML支持编写注释,使用#表示行注释,直到行末尾都是注释内容,类似于Python语法中的行注释。YAML是大小写敏感的,在编写时要注意大小写。
YAML中有3种数据类型——对象、数组和纯量,其中纯量中又包含了字符串、整数、浮点数、布尔值、空值、时间和日期。
YAML中的对象(mapping)类似于Python中的字典,它是一个由key和value组成的键值对。其中key可以是字符串、整数、浮点数,value可以是YAML中的任意数据类型。书写对象时,key不需要加双引号,且key后面紧跟英文冒号,冒号后面必须接空格,空格数量一般为1个,空格后面接对应的value。在缩进上,多个key一定要左侧对齐。对象类型的YAML数据如代码
name: netdevops01
ip: 192.168.137.1
对象类型的YAML数据所对应的Python数据
{'name': 'netdevops01', 'ip': '192.168.137.1'}
一组键值对中的value可以是对象、数组、纯量中的任意一种,类似于Python字典中的value,支持多种类型,这样可以让YAML数据表达出多层次的复杂数据。
YAML中的数组(sequence)类似于Python中的列表,它代表一个有序的集合。在数组中通过减号来表示成员,减号之后要添加1个空格再写成员的值,各个成员的减号要左对齐。数组类型的YAML数据,数组类型的YAML数据所对应的Python数据如代码
- dev01
- dev02
- dev03
['dev01','dev02','dev03']
如果数组的成员不多,且都是简单的字符串、数字类型,那么可以将其写成一排并用方括号括起来,成员之间用英文逗号隔开,这时无须再写减号。这种书写方式与Python的列表格式非常相像。数组类型的YAML数据的另一种格式如代码
[ dev01,dev02,dev03 ]
数组的成员可以是对象、数组、纯量中的任意一种,使用对象的数组表示一组端口信息的复杂YAML数据
- name: Eth1/1status: upallow_vlan:- 1- 200- 201
- name: Eth1/2status: upallow_vlan: [1,200,201]
- name: Eth1/3status: upallow_vlan: [1,200,201]
数组的每个成员都是一个表示端口信息的对象。端口对象中有一个allow_vlan字段,这个字段也是数组类型,且使用了带减号和不带减号两种方式表示
纯量(scalars)是最基本的、不可再分的值。YAML支持的纯量数据类型有字符串、整数、浮点数、布尔值、空值、时间和日期。
YAML中的字符串与Python数据类型中的字符串是一致的,它是数据格式中最基础的数据类型之一。单行字符串可以使用类似Python中的字符串定义方式,用单引号或者双引号包裹,也可以直接写字符串内容,无须引号包裹。从可读性和书写便利性角度考虑,人们多选择不加引号的写法
simple_str1: dev01
simple_str2: "This is dev01"
simple_str3: 'This is dev01'
在一些特殊的场景中,如字符串中涉及多行,可以考虑使用>或者|。>代表将字符串中的换行符替换为空格;|代表保留换行符,即使被程序加载,字符串也是多行的。无论是哪种方式,文本都要注意缩进,且一定是左对齐的。YAML中多行字符串的两种基本写法
yaml_multi_str1: >这是一个多行的字符串;字符串内容一定要对齐;换行都会被替换为空格。yaml_multi_str2: |这是一个多行的字符串;字符串内容一定要对齐;换行会被保留。
YAML支持整数与浮点数两种数字表示方法,分别对应Python中的整数与浮点数,它们的书写方式也一致
如果想要将数字表示为字符串,需要将数字用引号包裹,这样就不会被自动识别为整数或者浮点数。YAML中定义数字内容的字符串要通过引号显式地声明为字符串
YAML的布尔值与Python中的布尔值是一致的。真可以写为true、True、TRUE、on、On、ON、yes、Yes、YES中的任意一种;假可以写为false、False、FALSE、off、Off、OFF、no、No、NO中的任意一种。这些值都会被自动转换为布尔值
YAML中也支持Python中的空值None。Null、null或者不填写内容都被视为定义了一个空值。
YAML支持日期和时间两种格式。JSON是不支持这两种格式的,它们可以被分别转换为Python的两个内置类datetime.date和datetime.datetime。日期类date是精确到天,时间类datetime是精确到微秒,二者的书写格式必须遵循ISO 8601标准。
多文档的YAML数据
一个YAML文件中可以有多个YAML文档,每个YAML文档以3个减号(—)开始。这种多文档的YAML文件多出现在Ansible的playbook中。多个文档的YAML数据如代码清单所示,这是一个省略了很多内容的playbook,此处主要用于演示多个YAML文档。
# this is a play list
---
- name: play 01host: huawei_devs- name: play 02host: huawei_devs
---
- name: play 01host: cisco_devs- name: play 02host: cisco_devs
YAML文件包含两个YAML文档,每个文档的开头都是一个3个减号组成的标识,每个文档中都是对象数组的YAML数据。多文档YAML数据对应的Python数据对象如代码
[[{'name': 'play 01', 'host': 'huawei_devs'}, {'name': 'play 02', 'host': 'huawei_devs'}],[{'name': 'play 01', 'host': 'cisco_devs'}, {'name': 'play 02', 'host': 'cisco_devs'}]]
PyYAML包与YAML数据转换
PyYAML是一个用于解析和生成YAML数据的第三方Python包,它可以完成Python数据与YAML数据的相互转换。这里用的PyYAML的版本是6.0版本。PyYAML的安装命令是“pip install pyyaml”。需要注意的是,PyYAML在Python代码中导入的包名是yaml。
1 YAML数据转换为Python数据
YAML数据一般被保存在YAML文件中,为了演示PyYAML,需要创建一个文件名为demo.yml的YAML文件。使用yaml模块中的safe_load函数,可以将指定的YAML文件安全地转换为Python数据,这个函数只有stream一个参数,需要将其赋值为文本文件对象。使用safe_load函数将YAML数据转换为Python数据,
device:name: netdevops01ip: 192.168.137.1vendor: 华为online: truerack: '0101'start_u: 20end_u: 21interface_usage: 0.67interfaces:- eth1/1- eth1/2- eth1/3uptime: null
import yamlwith open('demo.yml', encoding='utf8') as f:data = yaml.safe_load(stream=f)print(data)
PyYAML还提供了safe_load_all函数。此函数可以将多文档的YAML文件转换为Python数据,它的参数与safe_load完全一致,返回结果是生成器对象。可以使用for循环遍历生成器中的成员。YAML的数据量一般不是很大,也可以将其强制转换为list列表类型来访问其中的数据。使用safe_load_all函数将YAML数据转换为Python数据,
import yamlwith open('demo2.yml', encoding='utf8') as f:data = yaml.safe_load_all(f)data = list(data)print(data)
2 Python数据转换为YAML数据
Python基础数据对象可以转换为YAML格式,并保存到文件中。YAML更适合人工编写,然后由程序解析,通过程序生成YAML文件的场景相对较少,因此读者了解其基本使用方法即可。通过dump函数可将Python数据转换为YAML数据。需要掌握以下4个参数。
通过dump函数可将Python数据转换为YAML数据。、
需要掌握以下4个参数。
• data: Python的数据对象。
• stream:导出的文本文件对象。
• allow_unicode:默认值为None,当Python数据中有汉字时,务必将其值设置为True,这样在YAML文件中才会显示为汉字。
• sort_keys:是否根据对象key进行排序,建议将其赋值为False,保证原有的顺序。使用dump函数将Python数据转换为YAML数据并写入文件,
import yamlpython_data = {'device': {'name': 'netdevops01', 'ip': '192.168.137.1','vendor': '华为', 'online': True, 'rack': '0101','start_u': 20, 'end_u': 21, 'interface_usage': 0.67,'interfaces': ['eth1/1', 'eth1/2', 'eth1/3'],'uptime': None}}
with open('dump_demo.yml', mode='w', encoding='utf8') as f:yaml.dump(python_data, stream=f, allow_unicode=True, sort_keys=False)
XML规范及其使用
可扩展标记语言(Extensible Markup Language, XML)是一种标记语言,主要用于计算机之间的处理信息,具有良好的扩展性和严谨的语法。通过标记语言的形式,XML定义了数据的结构和内容,使数据在不同的系统之间能够被准确地传输和解析。XML注重数据的存储与传输,被广泛用于承载Web服务的数据、配置文件、文档格式等场景。在网络运维自动化领域,XML用于承载NETCONF协议的指令和数据
XML中有3个重要的概念:元素(element)、标签(tag)和属性(attribute)。元素是构建XML文档的基本单位,它由标签和标签包裹的内容或者子元素组成。标签定义了元素的开始和结束,分为开始标签和结束标签,二者由尖括号包裹,开始标签与结束标签之间是元素的名称。结束标签比开始标签多一个斜杠,例如和是一组开始标签和结束标签。在元素的标签之间包裹了元素的信息内容,这些信息内容可以是普通文本,也可以是另一个子元素
标签中包裹的内容可以是若干子元素,类似于Python字典的嵌套。包含若干子元素的XML元素
<device> <name>netdevops01</name> <ip>192.168.137.1</ip> <vendor>华为</vendor> <online>true</online> <rack>0101</rack> <start_u>20</start_u> <end_u>21</end_u> <uptime>null</uptime>
</device>
XML的属性用于提供有关元素的额外信息,它们被记录在标签中。属性通常包含属性名称和属性值,它们之间用等号连接,属性值要在双引号中,多个属性之间要用空格隔开。在标签中添加属性,如代码清单所示,在device元素的标签中,用id属性标记了这台设备的ID值。
<device id="001"> <name>netdevops01</name> <ip>192.168.137.1</ip> <vendor>华为</vendor> <online>true</online> <rack>0101</rack> <start_u>20</start_u> <end_u>21</end_u> <uptime>null</uptime>
</device>
在网络运维自动化领域,XML报文头部多会添加序言(prolog),用于声明文档的版本和编码方式。XML文档头部添加声明版本和编码方式的序言,如代码清单
<?xml version="1.0" encoding="utf-8" ?>
<device id="001"><name>netdevops01</name><ip>192.168.137.1</ip><vendor>华为</vendor><online>true</online><rack>0101</rack><start_u>20</start_u><end_u>21</end_u><uptime>null</uptime>
</device>
XML本身对缩进不敏感。完全可以将上述所有XML报文的内容写在一行,但在开发中一般会适当调整XML缩进,从而提高文档可读性。
XML也支持列表数据的定义,XML需要先定义一个元素,用于承载列表数据的内容。列表数据的根元素内包含多个标签名一致的元素成员。有列表数据的XML文档如代码清单所示,其中使用XML定义了端口列表,在XML报文中先定义interfaces元素,用于承载端口列表的数据,然后定义若干interface元素。
<?xml version="1.0" encoding="UTF-8"?>
<interfaces><interface>eth1/1</interface><interface>eth1/2</interface><interface>eth1/3</interface>
</interfaces>
也可以是复杂的对象元素,只要复杂对象的标签是统一的即可。有复杂对象列表数据的XML文档如代码清单所示,它定义了一个网络设备对象的列表。
<?xml version="1.0" encoding="UTF-8"?>
<devices><device><name>netdevops01</name><ip>192.168.137.1</ip></device><device><name>netdevops02</name><ip>192.168.137.2</ip></device><device><name>netdevops03</name><ip>192.168.137.3</ip></device>
</devices>
XML的命名空间(namespace)用于在不同的上下文中区分同名的元素,例如在同一个XML文档中有两个不同含义的同名interfaces元素,就可以通过给两个interfaces元素定义不同的命名空间加以区分。用户可以通过统一资源标识符(uniform resource identifier, URI)定义命名空间,在指定元素的标签中定义一个xmlns属性即可。使用xmlns标签声明命名空间,如代码清单
<?xml version="1.0" encoding="UTF-8"?>
<device id="001" xmlns="huawei.com"><name>netdevops01</name><ip>192.168.137.1</ip><vendor>华为</vendor><online>true</online><rack>0101</rack><start_u>20</start_u><end_u>21</end_u><interface_usage>0.67</interface_usage><interfaces><interface>eth1/1</interface><interface>eth1/2</interface><interface>eth1/3</interface></interfaces><uptime>null</uptime>
</device>
命名空间还可以定义别名,以便在其他元素标签中被引用。别名写在xmlns属性之后,用冒号隔开。引用别名时将别名写到标签名称之前,并用英文冒号隔开。使用xmlns标签声明命名空间的另一种方法如代码清单
<?xml version="1.0" encoding="UTF-8"?>
<n:device xmlns:n="huawei.com"><n:name>netdevops01</n:name><n:ip>192.168.137.1</n:ip>
</n:device>
xmltodict包与XML数据转换
在网络运维自动化领域中,经常将XML数据转化为Python数据,以提高可读性。本书推荐使用Python的xmltodict包,它可将XML数据和Python数据进行转换,使用命令“pip install xmltodict==0.13”进行安装。
1 XML数据转换为Python数据
xmltodict的parse函数可以将XML数据转换为Python数据,并将XML数据赋值给第一个参数xml_input。使用xmltodict解析XML数据,如代码清单
import xmltodict
import jsonxml_text = """<?xml version="1.0" encoding="UTF-8"?>
<device><name>netdevops01</name><ip>192.168.137.1</ip><vendor>华为</vendor><online>true</online><rack>0101</rack><start_u>20</start_u><end_u>21</end_u><interface_usage>0.67</interface_usage><interfaces><interface>eth1/1</interface><interface>eth1/2</interface><interface>eth1/3</interface></interfaces><uptime>null</uptime>
</device>
"""data = xmltodict.parse(xml_input=xml_text)print(data)
执行结果
{'device': {'name': 'netdevops01', 'ip': '192.168.137.1', 'vendor': '华为', 'online':
'true', 'rack': '0101', 'start_u': '20', 'end_u': '21', 'interface_usage': '0.67',
'interfaces': {'interface': ['eth1/1', 'eth1/2', 'eth1/3']}, 'uptime': 'null'}}
2 Python数据转换为XML数据
unparse函数可将Python数据转换为XML数据,其使用场景并不多,读者了解即可。使用时,将unparse函数的第一个参数input_dict赋值为Python字典数据。使用xmltodict将Python数据转换为XML数据,如代码清单
import xmltodictpython_data = {'device':{'name': 'netdevops01', 'ip': '192.168.137.1','vendor': '华为', 'online': True, 'rack': '0101','start_u': 20, 'end_u': 21, 'interface_usage': 0.67,'interfaces': ['eth1/1', 'eth1/2', 'eth1/3'],'uptime': None}}# input_dict是要转换的Python数据
# output默认值为None,如果将其赋值为一个文件对象,就会将数据写入其中
xml_data = xmltodict.unparse(input_dict=python_data,output=None)
print(xml_data)
执行结果
<?xml version="1.0" encoding="utf-8"?>
<device><name>netdevops01</name><ip>192.168.137.1</ip><vendor>华为</vendor><online>true</online><rack>0101</rack><start_u>20</start_u><end_u>21</end_u><interface_usage>0.67</interface_usage><interfaces>eth1/1</interfaces><interfaces>eth1/2</interfaces><interfaces>eth1/3</interfaces><uptime></uptime>
</device>
表格数据与pandas
严格来说,CSV表格是一种数据格式,而以.xlsx为扩展名的Excel表格并不是一种数据格式。但在网络运维自动化领域中,用户不会过度区分表格文件的格式,而更专注于使用表格这种形式存储和使用数据,所以本书把两种表格都视为一种数据格式。
pandas提供read_excel和read_csv两个函数,可以分别读取Excel表格和CSV表格文件,并将其中的数据加载为pandas所独有的DataFrame对象。DataFrame对象可以被简单理解为二维的表格数据。DataFrame的数据结构及其基本概念如图
Column1~3对应字段名称,所有的字段名称被统称为columns,一行数据被称为row,一列数据被称为column。每条row都有一个索引值(index)。索引值默认是数字类型,从0开始排序,也可以指定为字符串等其他类型。DataFrame对象可以被pandas转换为字典列表,每个字典就是一条row数据,字典的key对应columns中的列名。
pandas从表格读取数据假设有两个网络设备清单的表格文件,分别是inventory.csv和inventory.xlsx。网络设备清单表格的文件内容如表
read_excel和read_csv两个函数的第一个参数可以直接赋值为表格文件的路径。pandas会将指定表格文件转换为DataFrame对象,并调用此对象的to_dict方法,将orient参数赋值为records,就可以将其转换成字典列表。使用pandas的read_excel函数从Excel表格中读取数据并转换为字典列表
import pandas as pddevs_df = pd.read_excel('inventory.xlsx')
devs = devs_df.to_dict(orient='records')
print(devs)
'''结果输出一个字典列表,截取部分作为演示
[{'name': 'netdevops01', 'hostname': '192.168.137.201'... 'device_type': 'huawei!'}]
'''
read_excel会默认读取Excel表格中第一个sheet的数据,用户也可将sheet_name赋值为对应的页签排序(从0开始的整数类型)或者页签名称(字符串类型
使用pandas的read_csv函数从CSV表格中读取数据并转换为字典列表
import pandas as pd devs_df = pd.read_csv('inventory.csv')
devs = devs_df.to_dict(orient='records')
print(devs)
'''结果输出一个字典列表,截取部分作为演示
[{'name': 'netdevops01', 'hostname': '192.168.137.201'... 'device_type': 'huawei!'}]
'''
pandas写入数据到表格
建议也是将数据整理成字典列表,再使用pandas将数据写入表格。借助第4章的内容,读者可以从网络配置的文本中提取这种结构化的字典列表数据。首先用字典列表去创建DataFrame对象,然后调用此对象的to_excel方法,就可以将数据写入Excel文件。使用字典列表数据构建DataFrame对象并写入Excel表格文件
import pandas as pdraw_data = [{'name': 'Eth1/1', 'desc': 'netdevops1'},{'name': 'Eth1/2', 'desc': 'netdevops2'}]
intf_df = pd.DataFrame(raw_data)print(intf_df)
''' 从打印的结果中,读者可以看到DataFrame是一种二维矩阵的数据name desc
0 Eth1/1 netdevops1
1 Eth1/2 netdevops2
'''
intf_df.to_excel('as01_info.xlsx', sheet_name='interfaces', index=False)
DataFrame对象的创建方式多种多样,它接受类型非常多的Python数据,推荐使用字典列表作为初始化的数据。DataFrame对象的to_excel方法可将数据写入Excel表格,需要关注以下3个参数。
• excel_writer:读者可以将其简单理解为写入的Excel表格名称。
• sheet_name:页签名称,属于字符串类型,选填,默认是Sheet1。
• index:显示数据条目的索引值,布尔类型,默认是True,建议设置为False。
如果想将数据写入CSV表格文件,可以调用DataFrame对象的to_csv方法,它的第一个也是最重要的参数是path_or_buf,仍可以将其简单理解为CSV文件的路径名称。另外需要关注的是index,其意义与to_excel的index参数一致。因为CSV文件无页签,所以没有sheet_name参数。使用字典列表数据构建DataFrame对象并写入CSV表格文件
import pandas as pdraw_data = [{'name': 'Eth1/1', 'desc': 'netdevops1'},{'name': 'Eth1/2', 'desc': 'netdevops2'}]
intf_df = pd.DataFrame(raw_data)intf_df.to_csv('as01_info.csv', index=False)