gpt4 book ai didi

Python大文件,如何查找具有特定字符串的特定行

转载 作者:太空宇宙 更新时间:2023-11-04 03:54:37 24 4
gpt4 key购买 nike

我正在使用 Python 处理来自非常大的文本文件(约 52GB,8 亿行,每行 30 列数据)的数据。我正在尝试找到一种有效的方法来查找特定行。幸运的是,该字符串始终位于第一列。

一切正常,内存不是问题(我没有加载它,只是根据需要打开和关闭文件)而且我还是在集群上运行它。它更多的是关于速度。该脚本需要几天才能运行!

数据看起来像这样:

scaffold126     1       C       0:0:20:0:0:0     0:0:1:0:0:0     0:0:0:0:0:0     
scaffold126 2 C 0:0:10:0:0:0 0:0:1:0:0:0 0:0:0:0:0:0
scaffold5112 2 C 0:0:10:0:0:0 0:0:1:0:0:0 0:0:0:0:0:0
scaffold5112 2 C 0:0:10:0:0:0 0:0:1:0:0:0 0:0:0:0:0:0

我正在搜索以第一列中的特定字符串开头的所有行。我想处理数据并将摘要发送到输出文件。然后我在所有行中搜索另一个字符串,依此类推...

我正在使用这样的东西:

for (thisScaff in AllScaffs):
InFile = open(sys.argv[2], 'r')
for line in InFile:
LineList = line.split()
currentScaff = LineList[0]
if (thisScaff == currentScaff):
#Then do this stuff...

主要问题似乎是必须查看所有 8 亿行以找到与当前字符串匹配的行。然后,一旦我转到另一个字符串,就必须再次查看所有 800 个。我一直在探索 grep 选项,但还有其他方法吗?

非常感谢!

最佳答案

显然您只想读取文件一次。一遍又一遍地阅读它是非常昂贵的。要加快搜索速度,请制作一组您要查找的字符串。像这样:

looking_for = set(AllScaffs)
with open(sys.argv[2]) as f:
for line in f:
if line.split(None, 1)[0] in looking_for:
# bingo! found one

line.split(None, 1) 在空格处拆分,但最多完成 1 次拆分。例如,

>>> "abc def ghi".split(None, 1)
['abc', 'def ghi']

这比拆分 29 次(如果每行有 30 个以空格分隔的列会发生这种情况)要快得多。

替代方案:

        if line[:line.find(' ')] in looking_for:

这可能会更快,因为根本没有创建任何列表。它搜索最左边的空白,并采用 line 的初始切片直到(但不包括)那个空白。

关于Python大文件,如何查找具有特定字符串的特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19548193/

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