我对某些东西感到有些困惑,我想知道这是否是一个蟒蛇的东西。我有一个使用Windows行结尾的文本文件(" \ r \ n"),但如果我遍历文件中的某些行,将它们存储在列表中,并打印出字符串表示形式控制台列表显示" \ n"行尾。我错过了什么吗?可能重复:
Handling \r\n vs \n newlines in python on Mac vs Windows
答案 0 :(得分:12)
是的,这是一个蟒蛇的事情;默认情况下,open()
以文本模式打开文件,其中行结尾根据您的代码运行的平台进行转换。您将在newline=''
调用中设置open()
,要求将行结尾不加改变地传递。
Python 2的标准open()
函数不支持此选项,并且仅以二进制模式打开会阻止转换,但您可以使用io.open()
代替使用Python 3行为。
newline
控制通用换行模式的工作方式(仅适用于文本模式)。[...]
- 从流中读取输入时,如果
newline
为None
,则启用通用换行模式。输入中的行可以'\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,有一个打开的换行选项可以控制换行符的行为。查看文档,看来普遍的换行支持是默认的。