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)
相关文章:
python网络自动化-数据格式与数据建模语言
数据格式 在Python网络运维自动化最基本是JSON、YAML和XML这3种数据格式。除了这3种常用的数据格式,还有一种深受网络工程师喜爱且在网络运维自动化中常用的数据承载方式——表格 需要注意的是JSON的键必须用双引号包裹,JSON的对象数据键值对的值和数组…...
C++ 中的 atan2 函数:深入解析与应用
在 C 编程中,数学计算是许多应用场景的核心,例如几何问题、物理模拟和游戏开发等。atan2 函数作为数学库中的一个重要工具,提供了比普通反正切函数更强大的功能。本文将深入解析 atan2 函数的原理、使用方法以及实际应用场景,并通…...
云计算-Azure Functions :构建事件驱动的云原生应用报告
云计算导论 课程研究报告 Azure Functions :构建事件驱动的云原生应用 摘要: Azure Functions 是一种无服务器解决方案,是由微软 Azure 平台提供的,可以使用户专注于业务逻辑,减少代码的编写,减少需要维护…...
【笔记——李沐动手学深度学习】2.3 线性代数
2.3.1 标量 标量由只有一个元素的张量表示。 下面的代码将实例化两个标量,并执行一些熟悉的算术运算,即加法、减、乘法、除法和指数。 2.3.2 向量 人们通过一维张量表示向量。一般来说,张量可以具有任意长度,取决于机器的内存限…...
多个 Job 并发运行时共享配置文件导致上下文污染,固化 Jenkins Job 上下文
基于 context.py 固化 Jenkins Job 上下文的完整方案,适用于你当前的工作流(Python Jenkins Pipeline),解决: 多个 Job 并发运行时共享配置文件导致上下文污染;读取环境变量或 JSON 文件时被其他 Job 修改…...
github 上的php项目
github 上的php项目 项目的网址 (Loong1996/LikeGirlSite: 情侣网站、情侣网页、恋爱记录网站) # 修改 # admin/Config_DB.php//localhost 为数据库地址 一般使用默认的即可 或(127.0.0.1) $db_address "mysql_php";/…...
防火墙快速管理软件,66K超小巧
软件介绍 今天为大家推荐一款轻量级的Windows防火墙管理工具,这款工具能帮助用户快速开启或关闭系统防火墙功能,操作比系统原生设置更加便捷高效。 软件优势 相比通过系统设置层层点击的操作方式,这款仅66KB大小的微型工具只需单击按钮…...
入门级STM32F103C8T6无人机遥控(原理图)
一、STM32主控电路 一、STM32 主控电路 把 STM32 想象成 “机器人的大脑”,核心电路是 “大脑的基础保障”:让大脑有电、有心跳(时钟 )、能复活(复位 )。 1. 电源引脚(VDD、VDDA、VSS 等 &#…...
无人机灯光驱动模块技术解析
一、运行方式 1. 核心流程: 指令接收:灯光控制模块通过无线通信链路(如WiFi, 数传电台,或专用的表演控制链路)接收来自地面站或中央控制系统的灯光指令。指令包含:颜色(RGB/RGBW值࿰…...
React + Umi(Umijs/Max) 搭建项目及配置
文章标题 01 环境准备02 快速构建2.1 参数选项2.2 umix 还是 umijs/max2.3 使用 pnpm (推荐)2.4 使用 npm 和 yarn2.5 启动项目2.6 启用 Prettier(可选)2.7 打包部署发布 03 Tailwind CSS 插件(可选)3.1 安…...
React 第六十四节Router中HashRouter的使用详细介绍及案例分析
前言 HashRouter 是 React Router 提供的一种路由实现方案,它使用 URL 的 hash 部分(# 后面的内容)来实现客户端路由功能。 一、HashRouter 的核心用途 客户端路由:在不刷新页面的情况下管理应用导航兼容性:支持不支…...
Linux RDMA网络配置手册
一、配置前准备工作 在进行 RDMA 网络配置之前,请确保以下准备工作已完成: 硬件环境 确保服务器支持 RDMA 功能,例如支持 InfiniBand 或 RoCE(RDMA over Converged Ethernet)的网卡。确保网络交换设备支持 RDMA 协议…...
sentinel与seata组件在微服务中的基本作用
微服务基础内容: 在微服务中,首先学习了微服务的横向拆分与纵向拆分,纵向拆分指按照功能拆分模块,横向拆分指将高复用的模块单独拆分,使纵向拆分的模块去调用这部分内容。 学习了基本拆分后,需要知道微服…...
Springboot 集成多数据源pgSql+mysql,启动报错
一.错误信息: 2025-06-25 20:25:50.870 ERROR [ai-manage-center,,] --- [ruid-ConnectionPool-Create-1057240219] DruidDataSource : create connection SQLException, url: jdbc:postgresql://10.10.60.227:5432/ai_dify1?sslmodedisable¤tSchemapub…...
南宫28NG相信品牌力量/Vue 3 中的组合式 API(Composition API)进阶实战
南宫28NG相信品牌力量【罔丨止:MGTY.PW】 点击此处复制到浏览器打开 随着 Vue 3 的普及,Composition API 已成为现代 Vue 开发的主流。本节我们将深入掌握组合式 API 的进阶用法,涵盖响应式工具、生命周期钩子封装、自定义逻辑抽离等关键技术…...
实战使用 Docker Compose 搭建 Redis Cluster 集群
文章目录 前言技术积累Docker Compose简介Redis Cluster简介Redis Cluster 解决的问题 实战演示部署环境创建目录编写Redis配置文件编写Docker-Compose.yml执行yml文件,启动容器查看容器状态创建集群验证集群集群数据验证 总结 前言 随着互联网技术的发展ÿ…...
Tauri(2.5.1)+Leptos(0.8.2)开发自用桌面小程序--DeepSeek辅助编程(俄罗斯方块)
在之前工作基础上(Tauri(2.5.1)Leptos(0.8.2)开发自用桌面小程序-CSDN博客),继续进行自用桌面小程序的开发,这次完全使用DeepSeek辅助编程做一个俄罗斯方块游戏,大部分代码由DeepSeek自主完成,Bug扔给DeepS…...
flex布局实例:把色子放进盒子里
目录 一、flex布局实例:把色子放进盒子里 1、基础样式 二、justify-content 属性 三、flex-direction 属性 四、align-items 属性 五、flex-wrap 属性 二、flex布局应用到常见场景 非常详细的讲解flex布局,看一看,练一练! …...
【启发式算法】RRT*算法详细介绍(Python)
📢本篇文章是博主人工智能(AI)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…...
基于R语言的亚组分析与森林图绘制1
亚组分析是临床研究中的重要分析方法,其核心是通过将研究对象按基线特征(如年龄、性别或吸烟状况等)划分为不同亚组,进而评估干预措施或暴露因素在各亚组中对结局影响的差异性。 在亚组分析中,交互作用(P for interaction)是关键指标,用于判断干预措施或暴露因素与亚组…...
idea, CreateProcess error=206, 文件名或扩展名太长
idea, CreateProcess error206, 文件名或扩展名太长 解决 “CreateProcess error206, 文件名或扩展名太长” 错误 CreateProcess error206 是 Windows 系统特有的错误,表示命令行参数超出了 Windows 的 32767 字符限制。这个问题在 Java 开发中尤其常见,…...
aspose.word在IIS后端DLL中高并发运行,线程安全隔离
aspose.word在IIS后端DLL中运行,加载很慢,如何为全部用户加载,再每个用户访问时在各自线程中直接可以打开WORD文件处理 Aspose.Words 在 IIS 中优化加载性能方案 针对 Aspose.Words 在 IIS 后端 DLL 中加载缓慢的问题,我们可以通过单例模式预加载组件并结合线程安…...
day042-负载均衡与web集群搭建
文章目录 0. 老男孩思想-面试官问:你对加班的看法?1. 负载均衡2. 搭建负载均衡的WordPress集群2.1 负载均衡服务器2.2 配置web服务器2.3 测试 踩坑记录1. /var/cache/nginx权限问题 0. 老男孩思想-面试官问:你对加班的看法? 互联网公司没有不加班的&a…...
DuDuTalk | 武汉赛思云科技有限公司通过武汉市人工智能企业认定!
近日,2025年武汉市人工智能企业名单正式公布!武汉赛思云科技有限公司(以下简称赛思云科技)凭借卓越的技术实力与创新成果,成功入选武汉市人工智能企业。这是对公司长期深耕AI语音智能领域、推动数字化转型的高度认可&a…...
Tita CRM飞书协同版:解锁企业销售与交付管理新效能
数字化转型的破局之道 在数字经济加速发展的今天,传统管理模式正面临前所未有的挑战: • 销售过程缺乏可视化管控手段 • 项目执行存在严重的信息孤岛 • 跨部门协作效率持续低下 • 绩效考核缺乏客观数据支撑 Tita CRM作为专业的智能化管理平台&#x…...
web安全之h2注入系统学习
起初是在N1 Junior 2025 上面碰到一题,考点是h2的sql注入。由于之前没有见过,趁此机会系统学习一番 实验代码 public class H2Inject {public static void main(String[] args) throws Exception{JdbcDataSource dataSource new JdbcDataSource();dataS…...
LVS-DR负载均衡群集深度实践:高性能架构设计与排障指南
目录 一、核心原理与理论 二、背景与架构设计 三、全流程部署步骤 1. NFS共享存储配置(192.168.7.100) 2. Real Server节点配置(四台服务器) 3. Director服务器配置 四、常见问题解决方案 五、生产环境总结 拓扑示意图&am…...
Java如何导出word(根据模板生成),通过word转成pdf,放压缩包
<!-- 导出word文档所需依赖--><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.0-beta</version></dependency><dependency><groupId>org.apache.poi</gr…...
.NET 7.0 EF Core:一、创建Web API 项目基础框架和用户表的增删改查
demo 地址: https://github.com/iotjin/Jh.Admin.NETCore 代码不定时更新,请前往github查看最新代码 .NET 7.0 EF Core:一、创建Web API项目 官方教程序一、项目目录结构各层职责说明1️⃣ Admin.NETCore.API(接口层)2️⃣ Admin.…...
一篇文章了解XML
一、什么是 XML? XML 是一种结构化数据的标记语言,用来存储、传输和描述数据。 它和 HTML 很像,但它的标签是自定义的,不限定格式和外观,而是强调数据的结构和含义。 XML不是用来展示数据的,HTML是用来展…...
Windows下安装zookeeper
有关Linux安装zk的文章可以参考下我之前写的: Zookeeper 3.8.4 安装和参数解析 Windows下的下载和Linux是一样的,都是同一个包,目前zk稳定版是 3.8.4 下载解压后 在根目录下创建 data 文件夹用来存放数据文件 在 conf 文件夹中,…...
计算机网络 网络层:控制平面
在本章中,包含网络层的控制平面组件。控制平面作为一种网络范围的逻辑,不仅控制沿着从源主机到目的主机的端到端路径间的路由器如何转发数据报,而且控制网络层组件和服务如何配置和管理。5.2节,传统的计算图中最低开销路径的路由选…...
探索阿里云智能媒体管理IMM:解锁媒体处理新境界
一、引言:开启智能媒体管理新时代 在数字化浪潮的席卷下,媒体行业正经历着前所未有的变革。从传统媒体到新媒体的转型,从内容生产到传播分发,每一个环节都在寻求更高效、更智能的解决方案。而云计算,作为推动这一变革…...
微信点餐小程序—美食物
本项目是基于WAMP Server 和PHP 动态网页技术构建的微信小程序点餐系统,该系统主要分为前端(微信小程序)和后端(基于PHPMySQL服务器端) 整体架构流程 1、前端部分 用户界面:展示菜品、处理用户点餐操作、…...
Python零基础入门到高手8.5节: 实现选择排序算法
目录 8.5.1 排序算法简介 8.5.2 选择排序算法 8.5.3 好好学习,天天向上 8.5.1 排序算法简介 所谓排序,是指将数据集合中的元素按从小到大的顺序进行排列,或按从大到小的顺序进行排列。前者称为升序排序,后者称为降序排序。在数…...
JavaEE初阶第四期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(二)
专栏:JavaEE初阶起飞计划 个人主页:手握风云 目录 一、Thread类及常用方法 2.1. Thread的常见构造方法 2.2. Thread的常见属性 2.3. 启动一个线程 2.4. 中断一个线程 2.5. 等待一个线程 2.6. 休眠当前线程 一、Thread类及常用方法 2.1. Thread的…...
Metasploit常用命令详解
一、Metasploit 概述 Metasploit是一款开源的渗透测试框架,由 H.D. Moore 于 2003 年首次发布,目前由 rapid7 公司维护。它整合了大量漏洞利用模块、后渗透工具和漏洞扫描功能,已成为网络安全工程师、红队 / 蓝队成员及安全研究人员的核心工…...
2025.6.24总结
今天发生了两件事,这每件事情都足以影响我的工作状态。 1.团队中有人要转岗 这算是最让我有些小震惊的事件了。我不明白,那个同事干得好好的,为啥会转岗,为啥会被调到其他团队。虽然团队有正编,有od,但我自始自终觉得…...
2023年全国青少年信息素养大赛Python 复赛真题——玩石头游戏
今日python每日练习题为——玩石头游戏,大家记得坚持刷题哦,闯入国赛~ 每轮可拿 1-3 块石头,双方均采取最优策略。若石头数 n 为 4 的倍数,无论先手取 k 块(1≤k≤3),后手总能取 4-k 块…...
MySQL之SQL性能优化策略
MySQL之SQL性能优化策略 一、主键优化策略1.1 主键的核心作用1.2 主键设计原则1.3 主键优化实践 二、ORDER BY优化策略2.1 ORDER BY执行原理2.2 ORDER BY优化技巧2.3 处理大结果集排序 三、GROUP BY优化策略3.1 GROUP BY执行原理3.2 GROUP BY优化方法 四、LIMIT优化策略4.1 LIM…...
AI时代工具:AIGC导航——AI工具集合
大家好!AIGC导航是一个汇集多种AIGC工具的平台,提供了丰富的工具和资源。 工具功能: 该平台整合了多样的AIGC工具,涵盖了绘画创作、写作辅助以及视频制作等多个领域。绘画工具能够生成高质量的图像作品;写作工具支持从构思到润色的全流程写…...
性能测试-jmeter实战4
课程:B站大学 记录软件测试-性能测试学习历程、掌握前端性能测试、后端性能测试、服务端性能测试的你才是一个专业的软件测试工程师 性能测试-jmeter实战4 jmeter环境搭建1. 安装Java环境(必需) JMeter环境搭建完整指南1. 安装Java࿰…...
C++字符串的行输入
1、字符串的输入 下面用一个真实的示例来进行演示: #include<iostream> #include<string>int main() {using namespace std;const int ArSize 20;char name[ArSize];char dessert[ArSize];cout << "Enter your name:\n";cin >>…...
【Linux网络与网络编程】15.DNS与ICMP协议
1. DNS 1.1 DNS介绍 TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序,但是 IP 地址不方便记忆,于是人们发明了一种叫主机名的字符串,并使用 hosts 文件来描述主机名和 IP 地址的关系。最初, 通过互连网信息中心(SRI-NIC)来…...
Python训练营-Day40-训练和测试的规范写法
1.单通道图片训练 # import torch # import torch.nn as nn # import torch.optim as optim # from torchvision import datasets, transforms # from torch.utils.data import DataLoader # import matplotlib.pyplot as plt # import numpy as np# # 设置中文字体支持 # plt…...
【Python-Day 29】万物皆对象:详解 Python 类的定义、实例化与 `__init__` 方法
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
内存泄漏和内存溢出的区别
内存泄漏(Memory Leak)和内存溢出(Memory Overflow / Out Of Memory, OOM)是软件开发中两个密切相关但又本质不同的内存问题: 核心区别一句话概括: 内存泄漏: 有垃圾对象占用内存却无法被回收&…...
Linux系统---Nginx配置nginx状态统计
配置Nignx状态统计 1、下载vts模块 https://github.com/vozlt/nginx-module-vts [rootclient ~]# nginx -s stop [rootclient ~]# ls anaconda-ks.cfg nginx-1.27.3 ceph-release-1-1.el7.noarch.rpm nginx-1.27.3.tar.gz info.sh …...
linux操作系统的软件架构分析
一、linux操作系统的层次结构 1.内核的主要功能 1)进程管理 2)内存管理 3)文件系统 4)进程间通信、I/O系统、网络通信协议等 2.系统程序 1)系统接口函数库,比如libc 2)shell程序 3)编译器、编辑…...
快速手搓一个MCP服务指南(三):FastMCP的核心组件-构建MCP服务的关键技术实现
FastMCP 是一套面向 LLM 应用开发的工具框架,通过标准化协议衔接大语言模型与外部功能组件,构建「LLM工具」的闭环交互体系。其核心技术体系包含四大模块:工具系统将 Python 函数转化为 LLM 可调用的能力单元,通过类型注解实现参数…...