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

在python中读取文件时执行无限循环,python,Python,我有一个包含单词列表的文件,我正试图逐行查找单词阅读。常见单词文件的示例如下: yourself yourselves z zero 该列表按字典顺序排序 def isCommonWord(word): commonWordList = open("common_words", 'r') commonWord = commonWordList.readline() commonWord = commonWord.rstrip("\n") while comm

我有一个包含单词列表的文件,我正试图逐行查找单词阅读。常见单词文件的示例如下:

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"
def isCommonWord(word):
commonWordList=open(“常用单词”,“r”)
commonWord=commonWordList.readline()
commonWord=commonWord.rstrip(“\n”)

而commonWord
readline
在您试图读取超过文件末尾的内容时将返回空字符串,空字符串将比较
'
任何单词,因此如果您要查找的单词是
文件中的任何单词,则循环条件始终为真

这可以通过将循环重写为

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
尽管问题的真正解决方案是读取一次文件,然后从中构建一个

common = set(ln.rstrip() for ln in open("common_words"))
print("true" if "zeros" in common else "false")
最可能的情况是,
“零”
位于文件中所有单词的后面,因此没有匹配项。当点击输入文件的EOF时,commonWord(您使用
.readline()
)将为空(
“”
),并且空字符串(返回“永远”)小于“零”,因此循环条件将永远不会终止

将循环条件更改为:

while commonWord and commonWord <= word:
    ...

而commonWord和commonWord如果找不到该单词并且该单词按字母顺序排在文件中最后一个单词之后,则没有添加退出循环的方法。“零”在文件中,但不是“零”

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

for commonWord in commonWordList:
    commonWord = commonWord.rstrip("\n")
    if commonWord <= word:
        break
    elif commonWord == word:
        return True 
return False
对于commonWordList中的commonWord:
commonWord=commonWord.rstrip(“\n”)

如果commonWord的问题是
零将出现在文件中最后一个单词的后面,但是您没有检查这一点。此外,
readline()
如果您已经到达文件的末尾,那么它只会给您一个空字符串,因此循环会一直认为“还没有到那里”,并一直持续下去

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


事实上,如果你有大量的空闲内存,你甚至可以做得更好:只需将整个文件读入一个大的
集合
,然后花固定的时间检查成员身份

问题可能是你自己的状况即使在到达文件末尾后,您似乎仍在继续执行
readline
。您想用此功能实现什么?@AshwiniChaudhary我有一个文件中的单词列表,我需要检查文件中的单词列表中是否有任何给定的单词。但是该函数在除“零”之外的所有情况下都可以正常工作。既适用于列表中的单词,也适用于列表中的单词。@QuaziFarhan:这是因为
“零”比较文件中的任何单词。尝试
zzz
进行更改,这将进入无限循环。它适用于列表中不在最后一个单词之前的单词。不完全适用——如果文件中间缺少该单词,则循环将终止。该列表的内存可能非常大(理论上),所以我不能总是假设有足够的内存,但当然,正如你所说的,可以实现某种方式的二进制搜索。我计划这样做,只是它在初始阶段。足够公平。(您也可以使用类似于
shelve
的方法来保存一个大的集合。)只需用commonWord而不是if(True):return True else:return false返回false您的代码中并没有任何错误,我的评论只是一个建议,以使其不那个么冗长(而且更清晰)
def isCommonWord(word):

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