使用Python的readlines时忽略最后一个\n

6 投票
2 回答
19040 浏览
提问于 2025-04-16 05:59

我有一个文件,内容大概是这样的:

1   value1
2   value2
3   value3

这个文件的最后一行可能有一个换行符,也可能没有。

我现在用的代码运行得很好,但如果最后一行有换行符,它就会出错。
请问有什么好的方法来处理这个问题吗?

这是我用的代码,供参考:

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

如果有换行符的话,就会出现这样的错误:
追踪记录(最近的调用在最前面):
文件 "./test",第 14 行,
print ref[0], ref[1]
索引错误:列表索引超出范围

2 个回答

2

我觉得你没有把事情的全部告诉我们。line.split() 的结果是一样的,不管最后一行是否以 \n 结束。

注意,文件的最后一行通常是以 \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个。

8

你可以忽略那些只包含空白字符的行:

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]

撰写回答