使用Python的readlines读取时忽略最后一个换行符

6

我有一个文件需要读取,它的格式如下:

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]

以下代码会出现错误:
Traceback (most recent call last):
File "./test", line 14, in
print ref[0], ref[1]
IndexError: list index out of range

错误提示为:列表索引超出范围。

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]

1
rstrip是多余的;split忽略前导/尾随空格。 - John Machin

2
我不认为你已经告诉我们全部的故事。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”结束)。 - Steven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接