0

我想在大文本中搜索字符串并检索其行号。是否有一种方法不包括 python 中的 2 个 for 循环。

4

4 回答 4

6
for i, line in enumerate(filehandle, 1):
    if text in line:
        print i, line
于 2012-07-19T05:58:45.597 回答
1

你可以用filter它来过滤掉它。提供一个 lambda 函数,该函数对于您想要的条件是正确的(例如,这里是该行的匹配项)。

作为第二个参数,给出你想要检查的所有行的列表(迭代器)。请注意,我使用izip, 将(line, line-number)元组的迭代器指向 lambda 函数。

请在下面找到函数: 如您所见,这里的限制是这仅适用于少于2^31 - 1行数的文件。

另外,请注意,它返回所有匹配行的行号列表。

from itertools import izip
def find_line_num_in_file(file, line):
    f = open(file, "r")
    matches = filter(lambda x: line in x[0], izip(f.readlines(), xrange(-1 + 2**31)))
    f.close()
    return [m[1] for m in matches]

如果您碰巧已经拥有这些行(即,不是迭代器),您可以这样做。

def find_line_num_in_lines(lines, line):
    matches = filter(lambda x: line in x[0], zip(lines, range(len(lines))))
    return [m[1] for m in matches]
于 2012-07-19T07:14:28.090 回答
0

这应该给你索引

In [112]: lines = filehandle.readlines()

In [113]: for elem in lines:
   .....:     if elem.find(substr) > -1:
   .....:         print lines.index(elem)
   .....:

包括 substr 多次出现的所有索引

In [122]: text = ['abc', 'def', 'ghi']

In [123]: for elem in text:
   .....:     if elem.find('e') > -1:
   .....:         print text.index(elem)
   .....:
1
于 2012-07-19T05:27:13.200 回答
-3
try:
    lstLines = fileHandle.readlines():
    lineNumber = lstLines.index("strSearch")
except:
    print "not found"
于 2012-07-19T05:28:54.470 回答