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それをフィルタリングするために使用できます。必要な条件に当てはまるラムダ関数を提供します(たとえば、ここでは行の一致です)。

2 番目のパラメーターとして、チェックするすべての行のリスト (反復子) を指定します。izip, を使用して、タプルのイテレータを(line, line-number)ラムダ関数に持つことに注意してください。

以下の関数を見つけてください: ご覧のとおり、ここでの制限は、これがより少ない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 に答える