<pre><code>f = open('some_file.txt','r')
line_num = 0
search_phrase = "the dog barked"
for line in f.readlines():
line_num += 1
if line.find(search_phrase) >= 0:
print line_num
</code></pre>
<p>1.5年后编辑(在看到它获得另一次投票后):我将保持原样;但如果我今天写的话,我会写一些更接近Ash/suzanshakya的解决方案:</p>
<pre><code>def line_num_for_phrase_in_file(phrase='the dog barked', filename='file.txt')
with open(filename,'r') as f:
for (i, line) in enumerate(f):
if phrase in line:
return i
return -1
</code></pre>
<ul>
<li>使用<code>with</code>打开文件是pythonic的习惯用法——它确保在使用文件的块结束时正确关闭文件</李>
<li>使用<code>for line in f</code>遍历文件比<code>for line in f.readlines()</code>要好得多。前者是pythonic(例如,如果<code>f</code>是任何泛型iterable,则可以使用前者;不一定是实现<code>readlines</code>的文件对象),更有效的是<code>f.readlines()</code>在内存中创建一个包含整个文件的列表,然后对其进行迭代。*<code>if search_phrase in line</code>比<code>if line.find(search_phrase) >= 0</code>更具pythonic,因为它不需要<code>line</code>来实现<code>find</code>,更容易阅读以查看意图,也不容易出错(例如<code>if line.find(search_phrase)</code>和<code>if line.find(search_phrase) > 0</code>这两种方法都不适用于所有情况,因为find返回第一个匹配的索引或-1)</李>
<li>与在循环之前初始化<code>line_num = 0</code>然后在循环中手动递增相比,在类似<code>enumerate</code>的<code>for i, line in enumerate(f)</code>中包装迭代项更简单/更干净。(尽管有争议,但对于不熟悉<code>enumerate</code>的人来说,这更难理解。)</li>
</ul>
<p>见<a href="http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html" rel="noreferrer">code like pythonista</a></p>