gpt4 book ai didi

python - 如何在多个文件中一次高效地搜索多个字符串?

转载 作者:太空宇宙 更新时间:2023-11-03 11:47:05 25 4
gpt4 key购买 nike

嗨,我发布了我的部分代码,然后我将解释我的目标:

for eachcsv in matches:
with open(eachcsv, 'r') as f:
lines = f.readlines()
for entry in rs:
for line in lines:
if entry in line:
print("found %s in %s" % (entry, eachcsv))

所以在“matches”中我得到了一个csv文件列表(它们的路径)。我打开每个csv文件,然后用readlines()将它们加载到内存中。”“RS”是唯一ID的列表。对于列表“rs”的每个元素,我需要搜索csv文件的每一行,每次在文件上找到id时打印(稍后我将测试该行是否还包含另一个固定单词)。
上面的代码对我有用,但我不知道为什么处理一个400K行文件需要10分钟以上的时间,我需要对上千个文件执行此任务,所以我不可能完成此任务。在我看来,缓慢的部分是测试过程,但我不确定。
请注意,我使用python是因为我更容易使用它,如果使用其他工具解决我的问题有任何其他解决方案,我可以使用它。
编辑:
我将试着发布一些示例
"rs" list:
rs12334435
rs3244567
rs897686
....

files

# header data not needed
# data
# data
# data
# data
# data [...]
#COLUMN1 COLUMN2 COLUMN3 ...
data rs7854.rs165463 dataSS=1(random_data)
data rs465465data datadata
data rs798436 dataSS=1
data datars45648 dataSS=1

最后一个目标是计算每个rs在每个文件上出现的次数,如果在第3列中有ss=1来在输出中标记它。
有点像
found rs12345 SS yes file 3 folder /root/foobar/file
found rs74565 SS no file 3 folder /root/foobar/file

最佳答案

很多问题是因为有很多嵌套循环。通过消除循环,您可能可以使程序更快:
其中一个循环覆盖文件中的每一行但如果全部
您要做的是确定是否存在任何匹配项。
文件,您可以在一个操作中搜索整个文件体成为
当然,这会搜索一个较长的字符串,但只需一次操作
在本机代码中而不是在python中执行。
你在所有的匹配字符串上循环。但你知道在你之前
开始,每个文件都是相同的。所以这是个好案子
做更多的前期工作将在
程序的其余部分。Stand back, I'm going to use a regularexpression
下面是代码的一个版本,它结合了这两种思想:

import re
import random
import sys
import time

# get_patterns makes up some test data.
def get_patterns():
rng = random.Random(1) # fixed seed, for reproducibility
n = 300
# Generate up to n unique integers between 60k and 80k.
return list(set([str(rng.randint(60000, 80000)) for _ in xrange(n)]))

def original(rs, matches):
for eachcsv in matches:
with open(eachcsv, 'r') as f:
lines = f.readlines()
for entry in rs:
for line in lines:
if entry in line:
print("found %s in %s" % (entry, eachcsv))

def mine(rs, matches):
my_rx = re.compile(build_regex(rs))
for eachcsv in matches:
with open(eachcsv, 'r') as f:
body = f.read()
matches = my_rx.findall(body)
for match in matches:
print "found %s in %s" % (match, eachcsv)

def build_regex(literal_patterns):
return "|".join([re.escape(pat) for pat in literal_patterns])

def print_elapsed_time(label, callable, args):
t1 = time.time()
callable(*args)
t2 = time.time()
elapsed_ms = (t2 - t1) * 1000
print "%8s: %9.1f milliseconds" % (label, elapsed_ms)


def main(args):
rs = get_patterns()
filenames = args[1:]
for function_name_and_function in (('original', original), ('mine', mine)):
name, func = function_name_and_function
print_elapsed_time(name, func, [rs, filenames])
return 0

if __name__ == '__main__':
sys.exit(main(sys.argv))

你的原始代码是 original而我的替代代码是 mine
对于300个模式,我的实现在计算机上以400毫秒的速度运行。大约是30倍的加速。对于更多的匹配字符串,改进应该更大。模式的数量增加一倍大约会使实现的运行时间增加一倍,但是基于regex的模式只需要大约3%的时间(尽管这部分是因为我的测试模式都有相似的前缀,对于实际数据可能不是这样)。
编辑:更新的代码为每个匹配项打印一条消息。我的代码现在有点慢了,但它仍然是一个改进,并且应该相对更快地说,要匹配更多的字符串:
~/source/stackoverflow/36923237$ python search.py example.csv
found green fox in example.csv
original: 9218.0 milliseconds
found green fox in example.csv
mine: 600.4 milliseconds

编辑:按要求解释regex技术。
假设您想在文件中搜索foobar和umspqux字符串一种方法是搜索文件中的第一个foobar,然后是umspqux。这是你开始的方法。
另一种方法是同时搜索两个字符串。假设您检查了文件的第一个字符如果是“f”或“u”,则可能是在查找匹配项,应检查第二个字符,分别是“o”或“m”等等。如果到达文件的末尾od,您将在文件中找到所有要查找的匹配项。
告诉计算机一次查找多个字符串的方便方法是使用正则表达式普通字符串是正则表达式。正则表达式“foobar”与“foobar is all fuzzy”中的子字符串“foobar”匹配。但是,你可以做更复杂的事情您可以将两个正则表达式组合成一个组合正则表达式,其中每个正则表达式都与某些内容匹配,而这些组合正则表达式将与这些内容中的任何一个匹配。这是用交替符号“”完成的。所以正则表达式“foobar umspqux”将匹配“foobar”或“umspqux”。您还可以通过用反斜杠“\”转义“|”的重要性来匹配真实的“|”。
这就是 build_regex_literal_patterns的全部内容。它将把列表['foobar','umspqux']转换成字符串'foobar umspqux'。尝试-将函数定义放入您自己的文件中,并使用一些尝试参数调用它,以查看其行为。
顺便说一句,这是一个很好的方法,可以找出任何一段代码是如何工作的——运行其中的一部分并打印中间结果当然,对于有副作用的程序来说,这是很难做到的,但是这个程序没有。
re.escapebuild_regex_literal_patterns的调用只需确保对任何特殊的正则表达式运算符(如'')进行转义(在本例中为'\'),以便它们与自身匹配。
正则表达式方法的最后一部分是使用编译后的正则表达式的findall方法。这只是返回输入字符串(即文件体)中正则表达式的所有匹配项。
您可以阅读 Python documentation on regular expressions中的python正则表达式。该文档基本上是参考资料,因此您可以从 Google Develoeprs site has an introduction to Python regular expressions开始找到更温和的介绍。 Jeffrey Friedl's Mastering Regular Expressions是一个关于正则表达式的非常全面的工作,虽然它没有覆盖正则表达式的python方言。

关于python - 如何在多个文件中一次高效地搜索多个字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36923237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com