1、从CMDB取下来的是一个json格式的数据。可以把它保存为一个文件,方便传递和保存。但这个文件直接读取后出来的是个字符串。需要处理后作为netmiko巡检脚本的设备列表文件。下面是处理脚本,主要用了字符串和列表的处理方法,输入元素的 CMDB文件数据,输出简化格式的巡检脚本设备列表文件。

    1. with open('./cmdb', mode='r', encoding = 'utf8') as f:
    2. cmdb = f.read()
    3. new_cmdb = cmdb.split('}, {')
    4. all_device_list = []
    5. for i in range(len(new_cmdb)):
    6. device = [1, 2, 3]
    7. list1 = new_cmdb[i].split(', ')
    8. for j in range(len(list1)):
    9. if 'dcCname' in list1[j]:
    10. device[0] = list1[j].split(': ')[1].strip('\'')
    11. elif 'manufacturer' in list1[j]:
    12. device[1] = list1[j].split(': ')[1].strip('\'')
    13. elif 'ip' in list1[j]:
    14. device[2] = list1[j].split(': ')[1].strip('\'')
    15. else:
    16. pass
    17. all_device_list.append(device)
    18. for i in range(len(all_device_list)):
    19. all_device_list[i] = ':'.join(all_device_list[i])
    20. all_device_set = set(all_device_list)
    21. all_device = list(all_device_set)
    22. all_device.sort()
    23. target = open('./allip_cmdb.txt', mode='a')
    24. for item in all_device:
    25. target.write(item)
    26. target.write('\n')
    27. target.close()

    总结:

    2、json 模块总结
    json 是一种大型数据结构。用于存储半结构化数据。半结构化数据,是介于关系型数据库的关系表那种结构化数据,和文件、音频、视频之类的完全非结构化数据之间的数据类型。它们没有严格的结构限制,但有明确的规范形式。(json数据有严格的形式规范,有在线校验网站可以校验其是否符合规范)
    json 本质上是字符串。也用于轻量级的数据交换场合。比如前后端之间,web客户端和服务器之间。json数据常用文件和非关系型数据库来存储。

    理解 json 数据,最关键的概念是对象。最基本的概念是属性。对象是一个抽象的概念,即json 数据要描述的事物。json字符串中一对大括号括起来的内容就是在描述一个对象。一个对象有一个或多个属性,属性在json中就是一个键值对。这点和Python的字典键值对很像,但有区别。json的键值对,键必须是字符串,而且必须用双引号。值可以是字符串,数字,布尔值,和其他对象,或上述类型组成的数组。这里的数组等同于Python的列表:list 。和Python的字典类似,json的键值对也是无须的。注意json中多个键值对之间用逗号分隔,最后一个键值对后面不能有逗号。数组内各元素也有这个要求:逗号分隔,最后面的元素后没有逗号。

    Python内置标准库里有json模块。用于json数据和Python数据的相互转换。
    json模块里最重要的4个函数。2个基础,2个扩展。

    基础:
    dumps()函数。用于将Python里的字典或字典组成的列表数据,转化为json数据。本质上是转化为字符串,字符串可以通过文件存储。
    s = json.dumps(data)
    data是Python里的字典或字典列表。dumps函数接收data为参数,返回json格式的字符串:s。字符串s可以用文件的形式保存。注意,这里的字符串s的形式已经符合json的标准了。如果字典里有不符合 json 标准的格式,dumps函数会自动转换。比如,将字符串的引号改为双引号;比如json要求键值对中的键必须是字符串,如果字典里的键是数字的话,数字将被当成字符串处理,即自动加上个双引号。等等。
    字符串 s 可以写入文件保存:
    with open(r’c:\123.json’)as f:
    f. write(s)

    loads()函数。用于将json数据转化为Python字典或字典组成的列表。输入是json格式的字符串,输出是Python字典或字典列表。
    d = json. loads(s)
    s 是json字符串,d 是Python字典或字典列表。

    扩展:
    dump()函数:注意,dumps()函数有返回。返回值是一个字符串(json格式的字符串)。由于用文件存取json数据太常用,而用dumps函数处理出来的是字符串,保存为文件时还要再读写一次。多一次操作。故有了dump函数,直接把Python字典或字典列表类数据写为json字符串文件。dump函数没有返回值。
    dump(data, f)
    data 为 Python 字典数据,f 为文件句柄。

    load()函数,支持从文件直接读取json数据(字符串文本),返回一个Python字典或字典列表。
    d = load(f)
    f 是一个json文件打开后的句柄,d 是load函数返回的字典。

    json数据格式调整。
    json数据本质是字符串。用dumps函数获取的json字符串默认是一行排列的。没有显示层级关系和缩进。dumps函数有indent参数可以按层级和缩进的方式生成json字符串。
    s_p = json. dumps(data, indent=4)

    loads 和 load 两个函数可以自动处理json字符串或文件里的空格和换行。生成标准的紧凑的Python字典或字典列表。
    dumps函数生成json字符串时,用逗号加空格分割对象内的属性(既键值对),用冒号加空格分割键值对的键和值。 为了是json数据更紧凑,可以调整分割符号,去掉空格。
    s= json. dumps(data, separators = (‘,’ ‘:’))
    由于json数据里键值对是无序的,字典里的键值对也是无序。在生成json字符串