【发布时间】:2017-10-23 07:30:35
【问题描述】:
我是 stackoverflow 和学习 python 的新手。
如果使用 Python 在一个 CSV 文件中搜索多个字符串(取自输入文件),我遇到了一些麻烦。
基本上,我的 python 代码从输入文件 (inputfile.csv) 中一个接一个地获取字符串,并搜索每个字符串是否位于另一个名为 mainfile.csv 的文件的第一列中。它只与包含我要查找的相关数据的 mainfile.csv 的第一列进行比较。
注意:文件非常大,mainfile.csv 有超过 100 万行(并且还在增长),而 inputfile.csv 通常大约有 30,000 行。
这里是代码。
#!/usr/bin/python
import csv
mainfile = open('mainfile.csv', 'rb')
inputfile = open('inputfile.csv', 'rb')
mfreader = csv.reader(mainfile, delimiter=',') # mainfile reader
ifreader = csv.reader(inputfile) # inputfile reader, just one column, no delimeter
for ifrow in ifreader:
for mfrow in mfreader:
if ifrow[0] == mfrow[0]:
print ifrow[0], mfrow[0] # This line is a print for debugging purpose
print "Found a match for : %s " % ifrow[0]
perform_some_operations()
else:
print ifrow[0], mfrow[0] # This line is a print for debugging purpose
continue
mainfile.close()
inputfile.close()
问题: “嵌套 for 循环”仅在 inpufile 的第一行中执行。它“忽略” inputfile.csv 的其他行。
编辑
其实我对这个问题的理解是错误的。第一个 for 循环 do 遍历输入文件的所有行。这是第二个嵌套的 for 循环,它只经过一次迭代过程。并且由于它到达了末尾,所以当第一个 for 循环迭代时,它不再执行任何迭代。
示例文件
以下是一些示例文件。出于示例的目的,“行值”被简化了。
基本上,我们处理 2 个文件:
MainFile : 包含产品信息列表(序列号、型号、文本信息)
InputFile:包含我试图在 MainFile 中查找的序列号列表
MainFile(mainfile.csv,文件大小:> 1,000,000 (1M) 行)
类型:序列号[varchar(64)]、型号[(varchar(64)]、信息[varchar(2048)]
SerialNumber, ModelNumber, Informations
SN111aaa, MN123425, Informations for SN111aaa
SN222bbb, MN123425, Informations for SN222bbb
SN333ccc, MN456789, Informations for SN333ccc
SN444ddd, MN654321, Informations for SN444ddd
SN555eee, MN123425, Informations for SN555eee
InputFile(inputfile.csv,文件大小:~30,000 (30K) 行)
类型:序列号[varchar(64)]
SN000xyz
SN111xyz
SN222xyz
SN333xyz
SN444ddd
在上面的例子中,由于 SN444ddd 是唯一可以在 inputfile 和 mainfile 中找到的字符串,我的 python 代码应该返回我(如果我们关闭调试行):
Found a match for SN444ddd
然后我可以执行一些操作。
但事实并非如此。我从调试打印行得到的是:
$ ./myprogram.py
SN000xyz SerialNumber
SN000xyz SN111aaa
SN000xyz SN222bbb
SN000xyz SN333ccc
SN000xyz SN444ddd
SN000xyz SN555eee
$
只处理输入文件的第一行。
编辑错误。参看。以前的编辑。
它还与 mainfile.csv 标头进行比较,但“问题”并不重要。
我哪里弄错了?
感谢您的帮助。
【问题讨论】:
-
绝对不是 CSV 的东西。这是 pandas 的工作,理想情况下是数据库
-
去掉“继续”。在第一个“if”分支中包含一个“break”。
-
@HubertGrzeskowiak 即使你这样做了,我们也在这里看到了 3000 万次迭代。
-
我同意@e4c5,但现在我不具备实现熊猫或数据库的知识。这将是下一步 (db)。
标签: python string csv search nested-loops