如果item不在列表中,则f.write(“,”)会检查太多次

时间:2017-01-01 22:21:40

标签: python

我不确定我的问题是在for循环还是在if语句中。

我的家庭实验室内有一堆虚拟路由器,我和paramiko能够将一些ip路由表提取到普通的文本文档中。使用正则表达式和拆分,我提取我想要的确切数据。我的目标是将这些数据放入.csv“方案”中,以便我可以将其上传到我的网站,并向我的老师进行网络的现场演示(以获取额外的积分!)

这是我目前的代码。问题在于最后七行代码。

#!/usr/bin/python3.5

### imports ###

import re
import sys
import csv

### Custom Functions ####


### VARIABLES ###

vrfarg = sys.argv[1]

bdiarray = []

### RUNTIME ####
c = open('output.csv', "w")
f = open('mplslist.txt', 'r')
for line in f:
    d = open(line, 'r')
    dsorted = sorted(d.readlines(), key=lambda x: int(x.split("BDI")[-1]))
    print(dsorted)
    for items in dsorted:
        bdi = re.findall(r'(?<=\BDI).*',items)
        print(bdi)
        for items in bdi:
            if items not in bdiarray:
                bdiarray.extend(bdi)
    d.close()
f.close()
print(bdiarray)

c.write(vrfarg + "\n")
c.write("VLANS:,")
for items in bdiarray:
    c.write(items + ",")
c.write("\n")

f = open('mplslist.txt', 'r')
for line in f:
    c.write(line.rstrip() + ",")
    d = open(line, 'r')
    dsorted = sorted(d.readlines(), key=lambda x: int(x.split("BDI")[-1]))
    print(dsorted)
    for d in dsorted:
        for items in bdiarray:
            if "BDI" + items in d:
                c.write("route ok!,")
            if not "BDI" + items in d:
                c.write(",")

对于路径文件中的每一行,我想检查“BDI”+ somenumber是否等于bdi数组中的项目,因此路径文件中的每一行都会遍历bdiarray中的所有项目,如果它们的名称匹配,(如果这些行包含确切的单词)c.write(“route ok!,”)并且对于它不匹配的所有项目,它应该执行c.write(“,”)(CSV中的空白单元格)文件)

输出应该是:

ROUTES TO ROUTER1,
VLANS:,9,708,3001,
ROUTER2,route ok!,route ok!,route ok!,

但输出是:

ROUTES TO ROUTER1,
VLANS:,9,708,3001,
ROUTER2,route ok!,,,,route ok!,,,,route ok!,

有什么建议吗?

我完全清楚这是相当垃圾的代码,我在文件中运行两次等等,我只需要一个PoC来显示我的老师,所以他会接受它作为考试主题(网络和编程),优化来得晚。

3 个答案:

答案 0 :(得分:0)

我认为如果删除这些行,您的预期输出将会显示:

if not "BDI" + items in d:
    c.write(",")

答案 1 :(得分:0)

我认为问题与你如何检查你在文件中找到的号码是否在你的列表中有关。您当前的代码使用列表的每个成员检查每个项目,并为每个检查写入一些输出。那不是你想要的。如果找到匹配项,则只需要写入一个输出,而不是列表中的每个项目都写入一个输出。

尝试替换此循环:

for items in bdiarray:
    if "BDI" + items in d:
        c.write("route ok!,")
    if not "BDI" + items in d:
        c.write(",")

使用此替代方法(使用any和生成器表达式):

if any("BDI" + items in d for items in bdiarray):
    c.write("route ok!,")
else:
    c.write(",")

答案 2 :(得分:0)

你有两个错误顺序的for循环:

for items in bdiarray:
    ok = False
    for d in dsorted:
        if "BDI" + items in d:
            ok = True
            break
    c.write("route ok!," if ok else ",")

any

for items in bdiarray:
    ok = any("BDI" + items in d for d in dsorted)
    c.write("route ok!," if ok else ",")