【问题标题】:Why is python saying that a string doesn't match the other when it does [duplicate]为什么python说一个字符串与另一个字符串不匹配[重复]
【发布时间】:2020-03-21 01:44:16
【问题描述】:

所以我有一个名为 words.txt 的文本文件,它包含 3 个单词:

apple
ship
door

而我要做的是让用户输入一个单词,然后搜索文件以查看是否有这样的单词,如果没有则添加:

def search(word):
    file = open("words.txt", "r+")

    for line in file:
        if line == word:
            return False

    file.write(word + "\n")
    return True

然后我使用该函数检查并打印结果,但问题是当我输入单词 ship 或列表中的任何其他单词时,它应该说它不存在是的。

【问题讨论】:

  • 正如其中一个答案所说,您未能定义预期的返回值是什么。如所写,在匹配的情况下返回 False,在不匹配的情况下返回 True(但文件已更新)。这似乎不是您所期望的。首先编写一个描述结果的文档字符串,然后您可以检查代码是否实现了这些结果(最好通过编写测试用例:))
  • 这可能是错误的两种方式:1)它无法返回False,因为您正在比较"ship""ship\n",而不是"ship""ship",或者2 ) 当"ship""ship" 进行比较时,它无法返回True。需要明确的是,绝对您不承认line 将以换行符结尾是一个问题,但您也可能交换了返回值。

标签: python file text


【解决方案1】:

你可能需要做 line=line[0:-1] 您拥有的 line 变量也有尾随的换行符 '\n'。

【讨论】:

  • 解决这个问题的方法是使用line.strip(),而不是扔掉最后一个字符。
  • @JanChristophTerasa line.strip() 会丢弃所有尾随前导空格。 line.rstrip('\n') 将是删除 just 单个换行符的更惯用方式。由于根据定义,最后一个字符是换行符,因此切片仍然有效。
  • 确实如此,但在给出的示例代码中应该是等价的。
  • 您的建议充其量相当于这个答案。一般来说,客观上是更糟
  • 我明白你的意思。但我仍然认为使用索引删除空格是不好的做法,并且一般而言这比使用striprstrip 更糟糕,因为您必须在代码中添加条件.对于这个问题,这无关紧要(因为使用striprstrip('\n') 无关紧要)。
【解决方案2】:

迭代文本文件时,行终止符\n 保留在循环索引中。您需要在比较之前将其删除:

def search(word):
    file = open("words.txt", "r+")

    for line in file:
        if line.rstrip('\n') == word:
            return False

    file.write(word + "\n")
    return True

如果文件中的任何前导和尾随空格不重要,您可以将line.rstrip('\n') 简化为line.strip()

>>> " foo \n".rstrip('\n')
" foo "
>>> " foo \n".strip()
"foo"

【讨论】:

  • line.rstrip('\n') 显然是唯一正确的答案,as we have discussed。包括strip() 解决方案似乎毫无意义。
猜你喜欢
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多