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新手,请高手指点。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 3,110评论 1 3
  • 1.模版介绍 这里将会介绍在python的web开发中广泛使用的模版语言jinja2.模版在web开发中使用最为广...
    11的雾阅读 1,440评论 0 3
  • 0. 简介 挂载bucket到本地文件系统,能够通过本地文件系统操作OSS 上的对象,实现数据的访问和共享。官方工...
    红薯爱帅阅读 5,603评论 0 1
  • 年少英雄志,愿作有识士。 立冠遇美人,佳偶天作成。 不喜鞭名马,亦怕醉金迷。 谦逊多嘉奖,博学高风尚。 冥冥有天意...
    翠谷风阅读 197评论 0 0
  • 万维钢是得到APP的专栏作家,也是非常受听众喜欢的专栏作家,其《万维钢-精英课程》第一季共有145907人订阅,第...
    顾一笑阅读 1,031评论 0 3

友情链接更多精彩内容