【问题标题】:Looping through a Dictionary / Ideas?循环浏览字典/想法?
【发布时间】:2017-12-15 09:07:24
【问题描述】:

我被困在水里了。我刚刚开始使用 python,这里是背景和我想要完成的事情......

背景: 我有 44 台联网交换机,每台都支持 telnet 和 ssh 连接。我还有一个 Ubuntu Apache 服务器,其中包含每个设备的配置(由名为“Nipper”http://sectools.org/tool/nipper/ 的工具解析)。 Nipper 可以很好地满足我们的需要。我对编程中的常用术语有基本的了解...(列表、元组、字典等),但我缺乏编码经验。

我想要完成的事情: 我刚开始编写一个 python 程序,目的是通过 Telnet/SSH 自动连接到每个交换机并提取每个交换机的配置。获得功能脚本后,我计划使用“Cron”每周安排任务,因此我们更新了网络文档。

我被困在哪里/我可以在哪里使用帮助和想法: 据我了解,我下面的代码将“/var/www/html/Directory.txt”文件读入字典“d”。我想为字典中的每个条目创建一个顺序循环,这样我就可以远程登录到设备“IP”并获取“运行配置”,然后将配置保存到“输出文件”“/var/www/html/Test_Output .csv”。

任何想法/帮助让我为每个条目启动此循环过程并能够将“IP”和“文件名”作为单独的变量/实体引用的代码结构将不胜感激。对于有更多经验的人,我的“参考文件”是否允许我使用“IP”和“文件名”值作为变量,还是我需要更改文件的格式?

到目前为止我的代码:

    #! /usr/bin/env python3
    import csv

    d = {}
    with open('/var/www/html/Test_Output.csv', mode='w') as outfile:
      with open('/var/www/html/Directory.txt.bak', mode='r') as infile:
        reader = csv.reader(infile)
        writer = csv.writer(outfile)
        for row in infile:
          rows = ( line.split(",") for line in infile )
          d = { row[0]:row[1:] for row in rows }
    print(d)
    #print(d['"01"'])


    #dlist = d.items()
    #dlist.sort()
    #print(dlist)
    #for key, filename in dlist:
    #  print(key, filename)

我的参考文件:“/var/www/html/Directory.txt” 注意顺序是...顺序密钥、IP 地址、文件名的完整路径

    "1",172.16.255.183,/var/www/html/Admin/AdminBld-3.html
    "2",172.16.255.201,/var/www/html/Admin/AdminBldg-1.html
    "3",172.16.255.115,/var/www/html/AV/AV-1.html
    "4",172.16.255.198,/var/www/html/MC/MC-198.html
    "5",172.16.255.101,/var/www/html/MC/MC-1.html
    "6",172.16.255.102,/var/www/html/MC/MC-2.html
    "7",172.16.255.103,/var/www/html/MC/MC-3.html
    "8",172.16.255.104,/var/www/html/MC/MC-4.html
    "9",172.16.255.105,/var/www/html/MC/MC-5.html
    "10",172.16.255.106,/var/www/html/MC/MC-6.html
    "11",172.16.255.108,/var/www/html/MC/MC-8.html
    "12",172.16.255.109,/var/www/html/MC/MC-9.html
    "13",172.16.255.2,/var/www/html/MDF/MDF-2.html
    "14",172.16.255.1,/var/www/html/MDF/MDF-4507.html
    "15",172.16.255.160,/var/www/html/RAM/RAM-2960-1.html
    "16",172.16.255.161,/var/www/html/RAM/RAM-2960-2.html
    "17",172.16.255.107,/var/www/html/SAC/SAC-1.html
    "18",172.16.255.111,/var/www/html/TR/TR1/TR1-1.html
    "19",172.16.255.112,/var/www/html/TR/TR1/TR1-2.html
    "20",172.16.255.113,/var/www/html/TR/TR1/TR1-3.html
    "21",172.16.255.114,/var/www/html/TR/TR1/TR1-4.html
    "22",172.16.255.121,/var/www/html/TR/TR2/TR2-1.html
    "23",172.16.255.122,/var/www/html/TR/TR2/TR2-2.html
    "24",172.16.255.123,/var/www/html/TR/TR2/TR2-3.html
    "25",172.16.255.124,/var/www/html/TR/TR2/TR2-4.html
    "26",172.16.255.126,/var/www/html/TR/TR2/TR2_5.html
    "27",172.16.255.131,/var/www/html/TR/TR3/TR3-1.html
    "28",172.16.255.132,/var/www/html/TR/TR3/TR3-2.html
    "29",172.16.255.133,/var/www/html/TR/TR3/TR3-3.html
    "30",172.16.255.134,/var/www/html/TR/TR3/TR3-4.html
    "31",172.16.255.141,/var/www/html/TR/TR4/TR4-1.html
    "32",172.16.255.142,/var/www/html/TR/TR4/TR4-2.html
    "33",172.16.255.143,/var/www/html/TR/TR4/TR4-3.html
    "34',172.16.255.144,/var/www/html/TR/TR4/TR4-4.html
    "35",172.16.255.145,/var/www/html/TR/TR4/TR4-5.html
    "36",172.16.255.151,/var/www/html/TR/TR5/TR5-1.html
    "37",172.16.255.152,/var/www/html/TR/TR5/TR5-2.html
    "38",172.16.255.153,/var/www/html/TR/TR5/TR5-3.html
    "39",172.16.255.181,/var/www/html/TR/TRSW/TRSW-1.html
    "40",172.16.255.184,/var/www/html/TR/TRSW/TRSW-3.html
    "41",172.16.255.171,/var/www/html/TR/TRTC/TRTC-1.html
    "42",172.16.255.172,/var/www/html/TR/TRTC/TRTC-2.html
    "43",172.16.255.173,/var/www/html/TR/TRTC/TRTC-3.html
    "44",172.16.255.175,/var/www/html/TR/TRTC/TRTC_5.html

当前脚本输出:(应该是字典“d”)

    {'"4"': ['172.16.255.198', '/var/www/html/MC/MC-198.html\n'], '"38"': ['172.16.255.153', '/var/www/html/TR/TR5/TR5-3.html\n'], '"16"': ['172.16.255.161', '/var/www/html/RAM/RAM-2960-2.html\n'], '"20"': ['172.16.255.113', '/var/www/html/TR/TR1/TR1-3.html\n'], '"40"': ['172.16.255.184', '/var/www/html/TR/TRSW/TRSW-3.html\n'], '"10"': ['172.16.255.106', '/var/www/html/MC/MC-6.html\n'], '"3"': ['172.16.255.115', '/var/www/html/AV/AV-1.html\n'], '"14"': ['172.16.255.1', '/var/www/html/MDF/MDF-4507.html\n'], '"9"': ['172.16.255.105', '/var/www/html/MC/MC-5.html\n'], '"39"': ['172.16.255.181', '/var/www/html/TR/TRSW/TRSW-1.html\n'], '"43"': ['172.16.255.173', '/var/www/html/TR/TRTC/TRTC-3.html\n'], '"41"': ['172.16.255.171', '/var/www/html/TR/TRTC/TRTC-1.html\n'], '"30"': ['172.16.255.134', '/var/www/html/TR/TR3/TR3-4.html\n'], '"7"': ['172.16.255.103', '/var/www/html/MC/MC-3.html\n'], '"32"': ['172.16.255.142', '/var/www/html/TR/TR4/TR4-2.html\n'], '"29"': ['172.16.255.133', '/var/www/html/TR/TR3/TR3-3.html\n'], '"33"': ['172.16.255.143', '/var/www/html/TR/TR4/TR4-3.html\n'], '"37"': ['172.16.255.152', '/var/www/html/TR/TR5/TR5-2.html\n'], '"17"': ['172.16.255.107', '/var/www/html/SAC/SAC-1.html\n'], '"28"': ['172.16.255.132', '/var/www/html/TR/TR3/TR3-2.html\n'], '"27"': ['172.16.255.131', '/var/www/html/TR/TR3/TR3-1.html\n'], '"2"': ['172.16.255.201', '/var/www/html/Admin/AdminBldg-1.html\n'], '"11"': ['172.16.255.108', '/var/www/html/MC/MC-8.html\n'], '"12"': ['172.16.255.109', '/var/www/html/MC/MC-9.html\n'], '"22"': ['172.16.255.121', '/var/www/html/TR/TR2/TR2-1.html\n'], '"44"': ['172.16.255.175', '/var/www/html/TR/TRTC/TRTC_5.html\n'], '"34\'': ['172.16.255.144', '/var/www/html/TR/TR4/TR4-4.html\n'], '"1"': ['172.16.255.183', '/var/www/html/Admin/AdminBld-3.html\n'], '"15"': ['172.16.255.160', '/var/www/html/RAM/RAM-2960-1.html\n'], '"26"': ['172.16.255.126', '/var/www/html/TR/TR2/TR2_5.html\n'], '"35"': ['172.16.255.145', '/var/www/html/TR/TR4/TR4-5.html\n'], '"6"': ['172.16.255.102', '/var/www/html/MC/MC-2.html\n'], '"21"': ['172.16.255.114', '/var/www/html/TR/TR1/TR1-4.html\n'], '"25"': ['172.16.255.124', '/var/www/html/TR/TR2/TR2-4.html\n'], '"24"': ['172.16.255.123', '/var/www/html/TR/TR2/TR2-3.html\n'], '"23"': ['172.16.255.122', '/var/www/html/TR/TR2/TR2-2.html\n'], '"19"': ['172.16.255.112', '/var/www/html/TR/TR1/TR1-2.html\n'], '"8"': ['172.16.255.104', '/var/www/html/MC/MC-4.html\n'], '"36"': ['172.16.255.151', '/var/www/html/TR/TR5/TR5-1.html\n'], '"18"': ['172.16.255.111', '/var/www/html/TR/TR1/TR1-1.html\n'], '"13"': ['172.16.255.2', '/var/www/html/MDF/MDF-2.html\n'], '"5"': ['172.16.255.101', '/var/www/html/MC/MC-1.html\n'], '"31"': ['172.16.255.141', '/var/www/html/TR/TR4/TR4-1.html\n'], '"42"': ['172.16.255.172', '/var/www/html/TR/TRTC/TRTC-2.html\n']}

【问题讨论】:

  • “我的理解是我的代码...”?你写的,但不确定它是做什么的?
  • 您正在创建一个 csv 阅读器 reader = csv.reader(infile),但随后没有使用它,而是在文件中的“原始”行上循环。这是故意的吗?
  • 根据您的要求,您的字典 d 输出看起来(有点)还可以。键中有一些额外的双引号,但这很容易修复。这些值是 2 项列表,IP 作为第一个列表项,文件名作为第二个列表项(带有尾随换行符,但同样很容易修复。所以......确切的问题是什么到目前为止你有什么?你无法做/理解什么?
  • Scott -- 我想我知道我的代码到目前为止在做什么。本质上,只是将“参考文件”读入字典。 (键,值)对。
  • Tom -- 1.) 我不知道循环“原始”行和使用 csv.reader 函数之间的区别。我会看一些文档 2.) 好的,额外的双引号来自顺序键......我会更新它。我是编程新手,如何在每个字典条目后删除“\n”?以后不删除尾随换行符会产生负面影响吗?我很好奇,没有受过教育。

标签: python ssh


【解决方案1】:

如果我对您的理解正确,您想要做的是您想要按顺序访问 IP 并在此之后执行一些操作。

我可以看到您字典中的键有额外的引号。尝试显示 d['4']。它会抛出一个错误。 要删除它,您应该使用 Python 的内置 csv 阅读器模块。

这样的东西应该可以正常工作:

with open('coors.csv', mode='r') as infile:
    reader = csv.reader(infile)
    with open('coors_new.csv', mode='w') as outfile:
        writer = csv.writer(outfile)
        mydict = {rows[0]:rows[1] for rows in reader}

现在让我们看看如何循环遍历字典。

for key in d:
    serialNo = key
    correspondingIP = d[serialNo][0]
    correspondingFilename = d[serialNo][1]

这应该可以帮助您摆脱多余的引号: Remove quotes in python dictionary

如果这有帮助,请告诉我:)

【讨论】:

  • beginner007,这基本上就是我要找的。此代码将从名为“correspondingIP”和“correspondingFilename”的字典中的列表中创建 2 个变量?然后我可以在 telnet 脚本中使用这些变量来完成我想要完成的任务!我会对此进行测试并通知您!
  • 很高兴能帮上忙!
  • 我希望提高我在 Stackoverflow 上的声誉。我真的可以在我的答案中使用 +1。谢谢:D
  • 我投了赞成票……但我的声望仍然太低,我的票数无法统计
【解决方案2】:

感谢大家花时间帮我看这个!就像我说的我是 python 新手。我也在努力了解软件定义网络 (SDN) 的基础知识,我从你们那里学到了很多东西,大家花时间发表想法和想法。

这是我的代码:

#! /usr/bin/env python3
import csv

d = {}
with open('/var/www/html/Test_Output.csv', mode='w') as outfile:
  with open('/var/www/html/Directory.txt', mode='r') as infile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile)
    for row in infile:
      rows = ( line.split(",") for line in infile )
      d = { row[0]:row[1:] for row in rows }
#print(d)

for key in d:
  serialNo = key
  correspondingIP = d[serialNo][0]
  correspondingFilename = d[serialNo][1]
  print(serialNo, correspondingIP, correspondingFilename)

现在,我感觉好多了,因为我可以轻松地单独引用每个字典项(密钥、IP 地址、文件名)。此代码应该是远程获取每个设备的配置的坚实基础。

再次感谢!

【讨论】:

    猜你喜欢
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    相关资源
    最近更新 更多