2019-06-02 python3 读取csv文件写入yaml

前面我们说过,读取yaml文件,配合jinja2,使用python脚本批量生成配置文件(请参考2019-05-30 Python+Jinja2+yaml 批量生成配置)
那么,yaml文件要自己去写的话,未免也太累了。一般最初的信息,大都使用excel来存储。好在这点python也能帮上忙,读取excel文件,生成yaml格式的文件。
python可以读取各种格式的excel文件,这里我只说一下读取csv格式的。
思路是这样的:
1、读取excel文件,生成一个列表,列表由N个字典组成,其中key是读取第一行的,values是每一行的内容。
2、通过计算,更新每个字典的值,使其符合批量生成配置的yaml文件需求。这里我需要通过loopback的IPV4地址生成IPV6地址,以及生成ISIS网络号。如果仅仅是读取csv直接生成yaml,那就更简单了,这一步可以省略。
3、循环读取更新后的字典,追加到临时列表里。
4、生成yaml文件。
脚本如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# 读取csv表格,生成字典
import csv
import os
from ruamel import yaml

#因为IPV6地址段已经确定,直接用seq变量,seq是编号,等于IPV4的地址最后一段,与其保持一致
def v6_loopback_from_node_no(seq):
    return '2AB2:6B62::{}'.format(seq)

#同理,IPV4的网段是确定的,生成ISIS网络号只需搞定倒数第二段的4位即可,L0 IP地址的最后一段,:03d 表示右对齐宽度3位。
def net_from_ip(ip):
    return '49.0001.xxxx.xxxx.6{:03d}.00'.format(int(ip.split('.')[3]))


curpath = os.path.dirname(os.path.realpath(__file__))
yamlpath = os.path.join(curpath, "ax-test.yaml")

with open("pops-test.csv",'r',encoding="utf-8") as f:
    reader = csv.reader(f)
    fieldnames = next(reader) # 获取数据的第一列,作为后续要转为字典的键名 生成器,使用next方法获取
    # print(fieldnames)
    csv_reader = csv.DictReader(f,fieldnames=fieldnames) #self._fieldnames = fieldnames   # list of keys for the dict 以list的形式存放键名
    dic_list = []   #临时列表
    for row in csv_reader:
        d={}
        for k,v in row.items():
            d[k]=v
        d['seq'] = int(d['seq'])
        d['v6_loopback'] = v6_loopback_from_node_no(d['seq'])
        d['net'] = net_from_ip(d['v4_loopback'])
        dic_list.append(d)
    with open(yamlpath, "w", encoding="utf-8") as f:
        yaml.dump(dic_list, f, Dumper=yaml.RoundTripDumper)
        print("Yaml file created: ", yamlpath)

生成的yaml格式是这样的:


 - hostname: ar01.xxx.lon
   seq: 1
   v4_loopback: xx.xxx.xx.1
   v6_loopback: 2AB2:6B62::1
   type: NE05E-SQ
   net: 49.0001.xxxx.xxxx.6001.00

 - hostname: ar01.xxx.lon
   seq: 2
   v4_loopback: xx.xxx.xx.2
   v6_loopback: 2AB2:6B62::2
   type: NE05E-SQ
   net: 49.0001.xxxx.xxxx.6002.00

 - hostname: ar01.xxx.lon
   seq: 4
   v4_loopback: xx.xxx.xx.4
   v6_loopback: 2AB2:6B62::4
   type: NE05E-SQ
   net: 49.0001.xxxx.xxxx.6004.00

python新手,请高手指点。

你可能感兴趣的:(2019-06-02 python3 读取csv文件写入yaml)