搜索csv的值,代码在ipython中工作,但在程序中使用时不起作用
我是初学者,只是为了作序 我有一个csv文件,如下所示: 主机名、ip、型号、版本、组、文件夹、主交换机、交换机角色 开关-id-1,10.10.10.102848,WB.16.08.0001,高压开关,顶部>TYC,“-”,指挥官 在ipython中运行此代码时,将正确查找具有ip和型号“2848”的行。当我在作为函数调用的程序中运行它时,它总是从文件的开头开始,并遍历每一行。如何让它抓取包含ip和型号的行(10.10.10.10和2848)。我试过使用DictReader和一个列表,但没能得到它搜索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和一个列表,但没能得
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_代码,这是一个在每行上迭代的循环,无论您在哪里执行它。这是一个很好的答案,并显示了一些改进谢谢大家。我知道我的方法不太正确,我理解你的大部分代码,但我能理解,这将进一步加深我的知识。