#read in csv file in form ("case, num, val \n case1, 1, baz\n...")
# convert to form FOO = "casenumval..." roughly 6 million characters
for someString in List: #60,000 substrings
if substr not in FOO:
#do stuff
else:
#do other stuff
所以我的问题是有太多的子字符串来检查这个庞大的字符串。我已经尝试逐行读取文件并检查该行的子字符串,但这仍然会导致程序崩溃。是否有任何技术可以有效地检查很多子串?
FOR CONTEXT: 我正在执行数据检查,可疑数据被保存到csv文件以进行检查/更改。然后将此已审核/更改的文件与原始文件进行比较。未更改的数据已经过验证,并且必须保存到新的“exceptionFile”中。已更改并通过的数据将被忽略。已更改并经过检查且仍然可疑的数据将被重新发送以供审核。
答案 0 :(得分:2)
你应该做的第一件事是将你的60,000个字符串列表转换成一个大的正则表达式:
import re
searcher = re.compile("|".join(re.escape(s) for s in List)
现在您可以一次搜索::
for m in searcher.finditer(FOO):
print(m.group(0)) # prints the substring that matched
如果你关心的只是知道找到了哪些,
print(set(m.group(0) for m in searcher.finditer(FOO))
这仍然比绝对最低限度的工作要多得多,但它应该比以前更有效 。
此外,如果您知道您的输入是CSV文件,并且您也知道没有任何字符串搜索包含换行符,您可以逐行操作,这可能是也可能不是比你做的更快取决于条件,但肯定会使用更少的内存:
with open("foo.csv") as FOO:
for line in FOO:
for m in searcher.finditer(line):
# do something with the substring that matched