【问题标题】:Process two CSV fies to find similar data and write results to 3rd csv file处理两个 CSV 文件以查找相似数据并将结果写入第三个 csv 文件
【发布时间】:2021-03-31 04:50:38
【问题描述】:

我正在尝试使用下面列出的数据读取两个 CSV 文件,比较每个文件的 MAC 地址,如果两个文件中都存在 MAC,则将以下信息写入第三个 CSV 文件(final.csv)

  • mac、接口、vlan、ip

两个输入文件是:

  1. swfile - 来自交换机上 MAC 表的信息(mac 地址、接口、vlan)
  2. rtrfile - 来自路由器上 ARP 表的信息(mac 地址,IP 地址)

我可以运行单个文件并获取所有信息,但是当我添加代码以包括读取和比较第二个文件时,我只从第一个文件中获取第一个 mac,它与中的 MAC 进行比较第二个文件,然后它结束。它不会遍历第一个文件中的其余 MAC。

这是示例 swfile 数据:

00:40:58:0E:28:2E,Gi1/0/50,1
00:40:84:21:26:6A,Gi2/0/36,1
00:4E:01:B3:58:67,Gi2/0/50,1
00:C0:B7:D9:C6:8A,Gi3/0/49,1
00:C0:B7:D9:CD:2B,Gi3/0/48,1
00:C0:B7:D9:CD:87,Gi2/0/49,1
00:C0:B7:F7:BC:9A,Gi1/0/50,1

这是示例 rtrfile 数据:

00:40:58:0E:28:2E,10.10.10.11
00:40:84:21:26:6A,10.10.10.21
00:4E:01:B3:58:67,10.10.10.95
00:C0:B7:D9:C6:8A,10.10.10.19
00:C0:B7:D9:CD:2B,10.10.10.14
00:C0:B7:D9:CD:87,10.10.10.15
00:C0:B7:F7:BC:9A,10.10.10.16

这是我目前的代码:

with open(rtrfile, 'r') as rfile:
    rtrreader = csv.reader(rfile, delimiter=',')
    with open(swfile, 'r') as sfile:
        swreader = csv.reader(sfile, delimiter=',')
        for row in rtrreader:
            rmac = row[0]
            for row in swreader:
                smac = row[0]
                if rmac == smac:
                    print("Found: " + rmac + " - " + smac)

正如我所说,它将从 rtrfile 读取第一个 MAC,从 swfile 中找到匹配的条目,打印它然后退出。它不会返回通过 rtrfile 来比较其余的 mac 地址。我该如何解决这个问题并使其能够将 rtrfile 中的所有 MAC 地址与 swfile 中的所有地址进行比较?

【问题讨论】:

    标签: python-3.x csv


    【解决方案1】:

    更好的方法是将这两个文件读入listdict,然后对其进行迭代以生成输出。我更喜欢dict,因为这样我们可以轻松检查第二个文件中的 MAC 地址是否已经存在于第一个文件中。 例如:

    macinfo = {} # Make an empty dict
    with open(swfile, 'r') as sfile:
        swreader = csv.reader(sfile, delimiter=',')
        for row in swreader:
            # row[0] is the MAC address
            # key of the dict is the MAC address. Value is the entire row. 
            macinfo[row[0]] = row 
            
    with open(rtrfile, 'r') as rfile:
        rtrreader = csv.reader(rfile, delimiter=',')    
        for row in rtrreader:
            try:
                # row[0] is the MAC address
                # Try to get the row having that MAC address from macinfo
                previously_read_row = macinfo[row[0]] # This line throws a KeyError if not found
                previously_read_row.append(row[1]) # Add the IP address
            except KeyError: # row[0] not found in dict; skip this row
                pass
    
    

    然后,您只需将macinfo 中的值写入新文件即可。

    with open(finalfile, "w") as wfile:
        fwriter = csv.writer(wfile, delimiter=",")
        fwriter.writerows(macinfo.values())
    

    finalfile 现在包含:

    00:40:58:0E:28:2E,Gi1/0/50,1,10.10.10.11
    00:40:84:21:26:6A,Gi2/0/36,1,10.10.10.21
    00:4E:01:B3:58:67,Gi2/0/50,1,10.10.10.95
    00:C0:B7:D9:C6:8A,Gi3/0/49,1,10.10.10.19
    00:C0:B7:D9:CD:2B,Gi3/0/48,1,10.10.10.14
    00:C0:B7:D9:CD:87,Gi2/0/49,1,10.10.10.15
    00:C0:B7:F7:BC:9A,Gi1/0/50,1,10.10.10.16
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多