【问题标题】:Ignore last \n when using readlines with python在 python 中使用 readlines 时忽略最后一个 \n
【发布时间】:2011-04-29 17:14:17
【问题描述】:

我有一个我从中读取的文件,看起来像:

1   value1
2   value2
3   value3

文件的最后一行可能有也可能没有尾随\n。

我使用的代码效果很好,但如果有一个尾随 \n,它就会失败。
抓住这个的最好方法是什么?

我的代码供参考:

r=open(sys.argv[1], 'r');
for line in r.readlines():
    ref=line.split();
    print ref[0], ref[1]

这会失败:
回溯(最近一次通话最后一次):
文件“./test”,第 14 行,在
打印参考 [0],参考 [1]
IndexError: 列表索引超出范围

【问题讨论】:

    标签: python readlines


    【解决方案1】:

    我认为你没有告诉我们整个故事。 line.split() 将给出相同的结果,无论最后一行是否以\n 结尾。

    请注意,文件中的最后一行被 \n 终止是常见的行为,人们偶尔会被没有终止的行所困扰。

    如果您要执行以下操作:

    print repr(line), repr(ref)
    

    而不是

    print ref[0], ref[1]
    

    您将能够自己检测到底发生了什么,而不是让我们猜测。

    如果正如@Mark Byers 推测的那样,您的最后一行是空的或仅包含空格,您可以通过以下更简单的代码忽略该行(以及所有其他此类行):

    for line in r: # readlines is passe
        ref = line.split() # split() ignores trailing whitespace
        if ref:
            print ref[0], ref[1]
    

    还请考虑您的最后一行中只有一个字段,而不是 0 或 2 的可能性。

    【讨论】:

    • 我认为他的意思是最后还有另一行,仅包含\n...(文件以“...value3\n\n”结尾)
    【解决方案2】:

    您可以忽略仅包含空格的行:

    for line in r.readlines():
        line = line.rstrip()      # Remove trailing whitespace.
        if line:                  # Only process non-empty lines.
            ref = line.split();
            print ref[0], ref[1]
    

    【讨论】:

    • rstrip 是多余的; split 忽略前导/训练空格
    猜你喜欢
    • 2018-03-23
    • 2013-02-17
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 2012-10-11
    相关资源
    最近更新 更多