12

可能重复:
在 Mac 和 Windows 上的 python 中处理 \r\n vs \n 换行符

我对某些事情有点困惑,我想知道这是否是 python 的事情。我有一个使用 Windows 行结尾 ("\r\n") 的文本文件,但如果我遍历文件中的某些行,将它们存储在列表中,然后将列表的字符串表示形式打印到控制台,它显示“\n”行结尾。我错过了什么吗?

4

3 回答 3

20

是的,这是一个 python 的东西;默认情况下open()以文本模式打开文件,其中行尾根据您的代码运行的平台进行翻译。您将newline=''open()通话中设置要求不改变行尾。

Python 2 的标准open()函数不支持此选项,并且仅以二进制模式打开会阻止翻译,但您可以通过 usingio.open()来使用 Python 3 的行为。

文档中open

newline控制通用换行模式的工作方式(它仅适用于文本模式)。

[...]

  • 从流中读取输入时,如果newlineNone,则启用通用换行模式。'\n'输入中的行可以以、'\r'或结尾,这些在返回给调用者之前被'\r\n'翻译成。'\n'如果是'',则启用通用换行模式,但行尾会返回给调用者,但不会翻译。
于 2012-05-28T13:10:31.653 回答
9

以二进制模式打开文件将在 Windows 上的 Py2 中避免这种情况。但是,在 Py3 中(如果您使用 Py2.6+io.open而不是内置),二进制模式与文本模式意味着定义明确且与平台无关,并且不影响通用换行符。相反,您可以这样做:

file = open(filename, 'r', newline='')

并且换行符不会被规范化。

于 2012-05-28T13:57:29.787 回答
7

您应该做的是打开具有通用换行支持的文件(对于 Python 2.x)。这是通过“U”或“rU”模式完成的。然后支持任何类型的换行符。以下文档在 python 手册http://docs.python.org/library/functions.html#open中给出:

除了标准的 fopen() 值模式之外,模式还可以是“U”或“rU”。Python 通常是用通用换行支持构建的;提供 'U' 将文件作为文本文件打开,但行可能被以下任何一种终止:Unix 行尾约定 '\n'、Macintosh 约定 '\r' 或 Windows 约定 '\ r\n'。所有这些外部表示都被 Python 程序视为“\n”。如果 Python 是在没有通用换行支持的情况下构建的,则带有“U”的模式与普通文本模式相同。请注意,如此打开的文件对象还有一个名为 newlines 的属性,其值为 None(如果尚未看到换行符)、'\n'、'\r'、'\r\n' 或包含所有看到的换行符类型。

对于 Python 3,有一个可以打开的换行选项来控制换行的行为。查看文档,似乎通用换行支持是默认设置。

于 2012-05-28T16:13:56.497 回答