在Linux中使用Python正确读取换行符

2 投票
2 回答
619 浏览
提问于 2025-04-19 03:25

在Windows系统中,如果我用Python的“for line in file”这种写法来读取普通文本文件的内容,最后一行通常不会以换行符结束,但之前的所有行都会有换行符。而在Linux系统中,这种情况似乎不同——当我逐行读取文件并打印内容时,我发现最后一行总是以换行符结束,即使在真实的文件中并没有这个换行符!我也试过使用file.readline()这个函数,结果也是一样。

(我假设这个文本文件确实没有以换行符结束。如果有的话,Linux会在文件末尾打印出两个换行符,而不是只有一个。)

我的代码非常简单。问题是它在Linux和Windows上产生的结果不同。

with open(path, 'r') as file:
    for line in file:
        print('>', line, '<', sep='')

    '''
    # Alternate method:
    while True:
        line = file.readline()
        if not line:
            break
        print('>', line, '<', sep='')
    '''

在Linux(准确来说是Ubuntu 13.10)上,最后一行总是会多出一个换行符。我在Python 2和3中都试过。有人知道这是怎么回事吗?

2 个回答

2

那如果去掉换行符呢?这就是你想要的效果吗?

with open('/Users/sebastian/Desktop/Untitled.txt', 'r') as file:
    for line in file:
        line = line.strip()
        if line:
            print('>', line, '<', sep='')

打印输出

>This is the first line<
>this is the second line<
>this is the third line<

PS:如果你的文本文件中间有空行,使用你提到的另一种方法可能会遇到问题。

编辑

可以看看 PEP278。在你的情况下,使用'U'模式可能会有帮助。

with open('/Users/sebastian/Desktop/Untitled.txt', 'rU') as file:
    for line in file:
        line = line.strip()
        print('>', line, '<', sep='')

打印输出

>This is the first line<
>this is the second line<
><
>this is the fourth line (blank line above)<
><

另外,你还可以添加一个特定于平台的额外行,比如通过

import platform

if platform.system()=='Windows':
    # do sth
else:
    # do sth
2

在Linux系统中,每个文本文件都是由一系列的行组成,并且最后必须有一个换行符。如果一个文件没有以换行符结束,Linux就不会把它当作文本文件来处理。这一点在Linux使用的POSIX文件系统中有明确规定。

3.206 Line

A sequence of zero or more non- <newline> characters plus a terminating <newline> character.

所以,这并不是你代码的问题,而是Linux文件系统的规定。你可以简单地去掉你从文件中读取的字符串末尾的换行符。

撰写回答