为什么这个简单的搜索不起作用?

时间:2014-03-18 17:30:06

标签: python

我只是在外部文件(包含一个短语)中进行迭代,并希望查看是否存在一行(其中包含“爸爸”一词)如果我找到它,我想用“妈妈”替换它。这是我建立的程序......但我不确定它为什么不起作用?!

message_file = open('test.txt','w')
message_file.write('Where\n')
message_file.write('is\n')
message_file.write('Dad\n')
message_file.close()

message_temp_file = open('testTEMP.txt','w')
message_file = open('test.txt','r')

for line in message_file:
    if line == 'Dad':  # look for the word
        message_temp_file.write('Mum')  # replace it with mum in temp file
    else:
        message_temp_file.write(line)  # else, just write the word

message_file.close()
message_temp_file.close()

import os
os.remove('test.txt')
os.rename('testTEMP.txt','test.txt')

这应该是这么简单......这让我生气!感谢。

3 个答案:

答案 0 :(得分:5)

您没有任何"Dad"行。您有一行"Dad\n",但没有"Dad"。此外,由于您已完成message_file.read(),因此光标位于文件的末尾,因此for line in message_file会立即返回StopIteration。您应该在message_file.seek(0)循环之前for进行。{/ p>

print(message_file.read())
message_file.seek(0)
for line in message_file:
    if line.strip() == "Dad":
        ...

这应该将光标放回文件的开头,并删除换行符并获得所需内容。

请注意,此练习是一般情况下如何不做事的一个很好的例子!更好的实施方式是:

in_ = message_file.read()
out = in_.replace("Dad","Mum")
message_temp_file.write(out)

答案 1 :(得分:3)

print(message_file.read())

这里你已经阅读了整个文件。 没有留下for循环来检查

文件对象始终会记住上次访问时它停止读/写的位置。 因此,如果您调用print(message_file.readline()),则会读取并打印文件的第一行。下次调用相同的命令时,将读取并打印第二行,依此类推,直到到达文件末尾。使用print(message_file.read()),您已阅读整个文件,而readreadline的任何进一步调用都不会给您任何信息

您可以按message_file.tell()获取当前位置,并按message_file.seek(value)将其设置为某个值,或者只是重新打开文件

答案 2 :(得分:2)

问题很可能是由于条件只匹配字符串"爸爸",当字符串实际上是"爸爸\ n"。您可以将条件更新为:

if line == "Dad\n":

OR

if "Dad" in line:

最后,当您调用print(message_file.read())时,您还会读取整个文件。您需要删除该行,或者您需要调用message_file.seek(0),以便后面的循环实际执行任何操作。