搜索csv的值,代码在ipython中工作,但在程序中使用时不起作用

搜索csv的值,代码在ipython中工作,但在程序中使用时不起作用,python,csv,Python,Csv,我是初学者,只是为了作序 我有一个csv文件,如下所示: 主机名、ip、型号、版本、组、文件夹、主交换机、交换机角色 开关-id-1,10.10.10.102848,WB.16.08.0001,高压开关,顶部>TYC,“-”,指挥官 在ipython中运行此代码时,将正确查找具有ip和型号“2848”的行。当我在作为函数调用的程序中运行它时,它总是从文件的开头开始,并遍历每一行。如何让它抓取包含ip和型号的行(10.10.10.10和2848)。我试过使用DictReader和一个列表,但没能得

我是初学者,只是为了作序

我有一个csv文件,如下所示:

主机名、ip、型号、版本、组、文件夹、主交换机、交换机角色

开关-id-1,10.10.10.102848,WB.16.08.0001,高压开关,顶部>TYC,“-”,指挥官

在ipython中运行此代码时,将正确查找具有ip和型号“2848”的行。当我在作为函数调用的程序中运行它时,它总是从文件的开头开始,并遍历每一行。如何让它抓取包含ip和型号的行(10.10.10.10和2848)。我试过使用DictReader和一个列表,但没能得到它

with io.open('switches_all.csv') as f:
         reader = csv.reader(f)
         for k,v in enumerate(reader):
             if '10.10.10.10' in v and '2848' in v:
                 print(v)

您需要知道找到它的行号,
k
值:

打开('switches_all.csv')作为f:
读卡器=csv。读卡器(f)
行=读卡器[k]

CSV文件没有索引,因此在找到包含您要查找的IP地址和型号名称的行之前,您肯定必须遍历每一行

也就是说,如果要在脚本执行期间重复调用此函数,则值得首先通过将IP地址和模型名映射到它们各自的文件位置(如dict)来构建此类索引,以便该函数可以在恒定时间内检索请求的行:

mapping = {}
with open('switches_all.csv') as f:
    position = 0
    for _, ip, model, *_ in csv.reader(f)
        mapping[ip, model] = position
        position = f.tell()

def get_row(ip, model):
    with open('switches_all.csv') as f:
        try:
            f.seek(mapping[ip, model])
        except KeyError:
            raise RuntimeError('No row found with the given IP and model.')
        return next(csv.reader(f))

print(get_row('10.10.10.10', '2848'))

enumerate
不会根据此代码执行您认为的操作,而且
reader
对象中的每一行都是一个
列表
是的,不需要
enumerate
,但代码对我来说仍然有效@dmw_代码,这是一个在每行上迭代的循环,无论您在哪里执行它。这是一个很好的答案,并显示了一些改进谢谢大家。我知道我的方法不太正确,我理解你的大部分代码,但我能理解,这将进一步加深我的知识。