首页 > 解决方案 > 为什么函数“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 来解决此问题,并且它工作正常。我在网上找不到有关此问题的任何信息,因此我决定发布此信息,以防有人知道为什么会发生这种情况。

标签: python

解决方案


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

这里有一些代码可以理解发生了什么:

somefile.txt

apple
banana
cow

script.py

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

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'

推荐阅读