python中的行结尾

时间:2012-05-28 13:02:43

标签: python

  

可能重复:
  Handling \r\n vs \n newlines in python on Mac vs Windows

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

3 个答案:

答案 0 :(得分:12)

是的,这是一个蟒蛇的事情;默认情况下,open()以文本模式打开文件,其中行结尾根据您的代码运行的平台进行转换。您将在newline=''调用中设置open(),要求将行结尾不加改变地传递。

Python 2的标准open()函数不支持此选项,并且仅以二进制模式打开会阻止转换,但您可以使用io.open()代替使用Python 3行为。

来自documentation on open

  

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

     

[...]

     
      
  • 从流中读取输入时,如果newlineNone,则启用通用换行模式。输入中的行可以'\n''\r''\r\n'结尾,并在返回给调用者之前将其转换为'\n'。如果是'',则启用通用换行模式,但行结尾将返回给未翻译的调用者。
  •   

答案 1 :(得分:8)

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

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

新行不会正常化。

答案 2 :(得分: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,有一个打开的换行选项可以控制换行符的行为。查看文档,看来普遍的换行支持是默认的。