在python中读取文件时的无限循环

时间:2012-04-20 09:41:22

标签: python

我有一个包含单词列表的文件,我正在尝试逐行查找单词。 common_words文件的示例如下:

yourself
yourselves
z
zero

列表按字典顺序排序。

def isCommonWord(word):

    commonWordList = open("common_words", 'r')
    commonWord = commonWordList.readline()
    commonWord = commonWord.rstrip("\n")

    while commonWord <= word:
        if commonWord == word:
            return True 
        commonWord =  commonWordList.readline()
        commonWord = commonWord.rstrip("\n")

    return False

if isCommonWord("zeros"):
    print "true"
else:
    print "false"

现在这个函数进入无限循环。我不知道这是怎么回事。任何帮助将不胜感激。 如果我尝试除“零”之外的其他变量,那么它的效果非常好。只有“零”,我才会遇到麻烦。谢谢你的时间。

6 个答案:

答案 0 :(得分:3)

问题是zeros会在文件中的最后一个单词后出现 - 但是你不会检查这个。此外,如果你到达文件的末尾,readline()将只给你一个空字符串,所以循环只是一直在思考“还没有”并且永远地去。

顺便说一句,有更好的方法可以做到这一点,使用列表排序的事实:看看二进制搜索

事实上,如果你有足够的内存可以做得更好:只需将整个文件读入一个大的set,然后需要一段时间来检查会员资格!

答案 1 :(得分:2)

当您尝试读取文件末尾时,

readline将返回空字符串,空字符串会比较''任何单词,因此如果单词'',则循环条件始终为true重新查找文件中的任何单词>

这可以通过将循环重写为

来解决
def isCommonWord(word):
    with open("common_words") as f:
        for w in f:
            w = w.rstrip()
            if w == word:
                return True
            elif w > word:
                break

    return False

虽然问题的真正解决方案是读取文件一次并从中构建set

common = set(ln.rstrip() for ln in open("common_words"))
print("true" if "zeros" in common else "false")

答案 2 :(得分:1)

最有可能的是,"zeros"位于文件common_words中的所有单词后面,因此无法匹配。当你输入文件的EOF时,commonWord(你用<fobj>.readline()读的)将为空(""),而空字符串(“永久”返回)小于“零”,所以你的循环条件永远不会终止。

将循环条件更改为:

while commonWord and commonWord <= word:
    ...

答案 3 :(得分:1)

对于"yourself"<="zeros",条件为真,而循环将无限延续。

所以,如果将任何单词传递给比其他单词大lexicographically的函数,则程序将进入无限循环。 例如。 "zz" “你自己”&lt; =“zz”会遇到一个无限循环,因为zz比文件lexicographically中的所有其他单词都大common_words

isCommonword()的更好版本将是:

def isCommonWord(word):

    commonWordList = open("common_words.txt")
    commonWord = [x.rstrip() for x in commonWordList]
    if word in commonWord:
        return True
    else:return False

答案 4 :(得分:0)

如果找不到单词并且在文件中的最后一个单词后面以字符形式显示,则没有为循环添加循环的方法。 “零”在文件中,但不是“零”

你的while循环的相当直接的翻译可能是

for commonWord in commonWordList:
    commonWord = commonWord.rstrip("\n")
    if commonWord <= word:
        break
    elif commonWord == word:
        return True 
return False

当到达文件末尾时,for循环自动终止

答案 5 :(得分:0)

问题可能出在您的情况commonWord <= word上。尝试使用!=并检查readline是否返回了某些内容。如果单词在列表中,则返回true,如果不是什么都没有打破循环:)