为什么该函数"len()"返回比实际字符串长 1 个字符的答案?



我创建了一个Python程序,如果单词长度不一定,它会从列表中删除单词。我设置了一个for循环,循环浏览我的列表,并检查每个单词的长度是否大于等于3。我的代码如下:

import string
text_file = open("ten-thousand-english-words.txt", "r")
lines = text_file.readlines()
text_file.close()
open('SortedWords.txt', 'w').close()
for i in lines:
print(len(i))
if len(i) >= 4:
sortedFile = open("SortedWords.txt", "a")  # append mode
sortedFile.write(i)
sortedFile.close()

我想创建一个新文件,只在单词为3个字符或更长的情况下复制它。

出于某种原因,它将列表中的所有单词读取为比实际长度长1个字符(例如,即使字母数为5,单词"Hello"也会返回6的长度(。

我修复了这个问题,使它看起来的长度是4而不是3,而且它工作正常。我在网上找不到任何关于这个问题的信息,所以我决定发布这个信息,以防有人知道为什么会发生这种情况。

文件中的每一行都有一个"\n〃;它的末尾表示一条换行符。我们无法在文本编辑器中看到这个字符,因为文本编辑器会自动将其转换为新行,但请放心,它就在那里。当您使用readlines()在python中读取文件时;\n〃;字符得以保留。这就是为什么你得到的长度比预期的多1。

这里有一些代码来了解发生了什么:

somefile.txt

apple
banana
cow

script.py

with open("somefile.txt") as fi:
for line in fi.readlines():
print(repr(line))
>>> 'applen'
>>> 'bananan'
>>> 'cown'

python中的repr函数将打印字符串的文字表示(即,当它看到"\n"时不会写换行符,它只会按原样打印(。如果我们在打印前不使用repr,我们的输出将是:

apple
banana
cow

请注意,每个字符串之间都有额外的行,因为python正在打印2个换行符:1个来自字符串本身,1个默认情况下从print函数添加到末尾。

为了去掉换行符,我们可以使用my_string.strip(),它将删除任何尾随或前导空格:

with open("somefile.txt") as fi:
for line in fi.readlines():
print(repr(line.strip()))
>>> 'apple'
>>> 'banana'
>>> 'cow'

每一行都以'n'结尾,这就是您看到的的"+1">

您的程序可能和一样简单

with open("ten-thousand-english-words.txt", "r") as lines:
with open("SortedWords.txt", "w") as sortedFile:
for line in lines:
if len(line) >= 4:
sortedFile.write(line)

对您的程序的分析和对矿的解释:

  1. 其他人解释了为什么长度更长,所以您正确地使用了>= 4而不是>= 3

  2. 你的import string没用。

  3. 您的命令

    open('SortedWords.txt', 'w').close()
    

    无用(简单地删除它并进行我下面描述的更改(,因为它打开文件并立即关闭它,有效地

    • 创建一个空文件,如果它还不存在
    • 清空其内容(如果存在的话(

    再一次,它是无用的。

    这样做的唯一原因似乎是您稍后在附加模式下重复打开一个空文件的命令:

    if len(i) >= 4:
    sortedFile = open("SortedWords.txt", "a")     # append mode
    sortedFile.write(i)                 
    

    但是:

    • 打开一个已经打开的文件不会有任何效果

    • 为什么要重复打开/关闭文件?您可以简单地在写入模式下打开它,然后在循环中写入:

      sortedFile = open("SortedWords.txt", "w")     # NO append mode - WRITE mode
      if len(i) >= 5:
      sortedFile.write(i)
      
  4. 与其手动关闭打开的文件,不如使用所谓的上下文管理器(即with语句(自动关闭它:

    with open(...) as f:
    ...
    ...
    # after dedent the file is automatically closed
    
  5. 为了使程序更加防弹,请使用.strip()方法删除单词(包括n(前后的最终空白。

    在这种情况下,

    • 使用CCD_ 16比较
    • 在向文件写入字(即行(时添加n符号:
    with open("ten-thousand-english-words.txt", "r") as lines:
    with open("SortedWords.txt", "w") as sortedFile:
    for line in lines:
    line = line.strip()
    if len(line) >= 3:
    sortedFile.write(line + "n")
    

相关内容

最新更新