【问题标题】:Using Python to read newline characters correctly in Linux在 Linux 中使用 Python 正确读取换行符
【发布时间】:2014-08-31 23:53:12
【问题描述】:

在 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 中都试过了。知道这里发生了什么吗?

【问题讨论】:

  • 我无法在 Linux 上使用 Python 2.7.8 或 Python 3.4.1 重现此行为,文件的最后一行没有以换行符结尾。你确定吗?最后一行是否以 \r 结尾,也许?

标签: python linux newline eof


【解决方案1】:

Linux 中的每个文本文件都由一系列行加上一个终止换行符组成。如果文件在 linux 中不以换行符结尾,则不会将其视为文本文件。 这是在 linux 使用的POSIX file system 中定义的。

3.206 Line

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

所以这不是您的代码的问题。它只是linux下的文件系统。 您可以简单地删除从文件中读取的字符串中的终止换行符。

【讨论】:

  • 我明白你的意思——这些换行符实际上是由 GEdit 添加的,而在处理普通的 Windows 文件时它们不存在。看起来我只需要在 Windows 上和 Linux 上做不同的操作,这是我害怕的!
【解决方案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)<
><

或者,您可以添加一个特定于平台的额外行,例如,通过

导入平台

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

【讨论】:

  • 不幸的是,我需要能够确定包括最后一行在内的每一行是否真正以换行符结尾。关于我的替代方法的好点,这只是为了看看问题是否与“文件中的行”语法有关。
  • @wdep1 在这种情况下,您不应该使用通用换行模式(默认启用)。使用io.open函数并设置关键字参数newline=''
  • 我试过这个,但它似乎产生了相同的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 2015-09-03
  • 2021-12-11
  • 2017-03-21
  • 1970-01-01
  • 2013-08-20
相关资源
最近更新 更多