【问题标题】:Different behaviour shown when running the same code for a file and for a list为文件和列表运行相同代码时显示的不同行为
【发布时间】:2017-11-13 07:42:50
【问题描述】:

当我尝试对文件中的单词和列表中的单词进行字符串切片时,我观察到了这种不寻常的行为。两种结果都完全不同。

例如,我有一个文件“words.txt”,其中包含以下内容

POPE
POPS
ROPE
POKE
COPE
PAPE
NOPE
POLE

当我编写下面的代码时,我希望得到一个省略了最后一个字母的单词列表。

with open("words.txt", "r") as fo:
    for l in fo:
        print(l[:-1])

但是我在下面得到了这个结果。没有发生字符串切片,单词和以前一样。

POPE
POPS
ROPE
POKE
COPE
PAPE
NOPE
POLE

但是如果我写下面的代码,我会得到我想要的

lis = ["POPE", "POPS", "ROPE", "POKE", "COPE", "PAPE", "NOPE", "POLE"]
for i in lis:
    print(i[:-1])

我可以按预期删除每个单词的最后一个字母。

POP
POP
ROP
POK
COP
PAP
NOP
POL

那么为什么我会在同一个操作 [: -1] 中看到两个不同的结果?

【问题讨论】:

    标签: python-3.x list file


    【解决方案1】:

    文件中的行以\n 结尾,而列表中不需要行结尾。

    你的实际文件内容如下

    POPE\n
    POPS\n
    ROPE\n
    POKE\n
    COPE\n
    PAPE\n
    NOPE\n
    POLE\n
    

    因此 print(l[:-1]) 实际上是修剪行尾,即 \n

    要验证这一点,请在循环之前声明一个空列表,并将每一行添加到该列表并打印它。你会发现每一行都包含\n

    stuff = []
    
    with open("words.txt", "r") as fo:
         for line in fo:
             stuff.append(line)
    
    print stuff
    

    这将打印['POPE\n', 'POPS\n', 'ROPE\n', 'POKE\n']


    如果我没记错的话,你想对文件内容进行切片操作。我想你应该看看strip() method

    【讨论】:

    • 嘿,非常感谢!你的回答真的很丰富!
    • 欢迎您!多使用 google,google 是你的朋友,print statements 也是如此
    • 我做到了,但他们只谈论了 splitlines()、strip() 等方法。不知道这是在幕后发生的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多