循环使用CSV文件进行暂存目的

时间:2016-03-05 11:13:41

标签: python csv

早上好的家伙

这一次,我没有提出具体的代码问题,而是使用了#34;我是否在正确的轨道上"问题

我想编写一个用于暂存网络设备的脚本。我将获得一个包含两列的cvs列表:Hostname + HW Type,类似于:

Hostname,Type
TestAP-1,AP250
TestAP-2,AP250
TestAP-3,AP250
TestSW-1,SW100
TestSW-2,SW100
TestAP-4,AP250

真正的清单显然会更长。

到目前为止,我的想法是解析调用HW Type脚本的参数以获取Hostnames列表。然后连接到硬件(IP地址将始终是相同的默认IP或通过串行控制台),向硬件发送一些命令(设置主机名,系统日志服务器IP等),再次从机器读取值(使用show命令) )并将结果写入另一个csv文件。

类似的东西:

staging.py AP250
get a list with all hostnames where the HW Type is AP250
loop
connect (ssh or serial) to the hardware
commands:
  set hostname 'hostname'
  set syslog ip (fixed ip address, the same for all devices)
  set whatever need to be set as well
the do a show on these settings and parse the value
write the value to a output csv file (create or append)

我是否在正确的轨道上?现在,我的脚本如下所示:

import csv
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('Type', type=str,
                    help='REQUIRED: Please enter the Hardware Type (AP250, SW100, etc)')

args = parser.parse_args()

Manager = "manager.domain.com"
MACAddress = "aa:bb:cc:dd:ee:ff"

with open("input.csv", 'r', newline='') as f:

    reader = csv.DictReader(f)
    for row in reader:
        if row['Type'] == args.Type:

            print(row['Hostname']) # This will later on be replaced by some paramiko code
            h = (row['Hostname'])
            t = (row['Type'])

            outdict = {}
            print (outdict)

            """
            with open('output.csv', 'w', newline='') as o:
                writer = csv.DictWriter(o, delimiter=',', fieldnames=["Hostname", "Type", "Hivemanager", "MACAddress"])
                writer.writeheader()
                newrow = (h + "," + t + "," + Manager + "," + MACAddress)
                writer.writerow(newrow)
                #writer.writerows(['Hostname'], ['Type'], Manager)

            print (open('output.csv', 'r').read())
            """
        input("Press Enter to continue")

我不确定的地方:

  • 正在使用词典正确的方法吗?
  • 循环遍历主机名列表并以正确的方式在该循环中执行所有操作?

我不希望完全正常工作的脚本作为答案。而不是那些,我可以得到一些想法的一些提示或链接将是伟大的。

非常感谢。

1 个答案:

答案 0 :(得分:1)

关于你的第一个问题,正在使用词典正确的做法与否,答案是双重的。首先,如果你的目标是csv读者,那么绝对。这是正确的做法。您以CSV格式获取输入数据,因此csv.DictReader没有合理的方法。其次,输出部分;这是您希望存储返回值的位置。你不一定需要一本字典,在我看来,列表会更容易。您计划使用outdict,对吧?但这也是个人品味的问题,字典也是如此,只是访问数据有点不同。底线是:是的,你在第一个问题的正确轨道上。

在主机名上循环并在每个主机名上执行所有操作会有什么(明智的)替代方案?这样可以最大限度地减少必须对各个主机执行的登录操作,如果在脚本中间断开网络连接,则只需修复一个主机,而不是全部主机。

我希望这会对你有所帮助。