Python,使用CRLF照原样读取CRLF文本文件


问题内容
with open(fn, 'rt') as f:
    lines = f.readlines()

读取带有LF行尾的CR LF文本文件(WinXP,Py 2.6)。因此lines包含“ \ n”结尾。如何按原样获取行:

  • 对于CRLF文件,获取以’\ n \ r’结尾的行
  • 对于LF文件获取以’\ n’结尾的行

问题答案:

代替内置open()函数,使用io.open()。这使您可以更好地控制使用newline参数处理换行符的方式:

import io

with io.open(fn, 'rt', newline='') as f:
    lines = f.readlines()

设置newline为空字符串,将启用通用换行符支持,但返回未翻译的行尾;您仍然可以使用.readlines()查找以任何合法行终止符终止的行,但是返回的数据与在文件中找到的数据完全相同:

输入时,如果newline为None,则启用通用换行模式。输入中的行可以以'\n''\r'或结束,在返回给调用方之前'\r\n',这些行会被翻译成'\n'。如果是'',则启用通用换行模式,但
行结尾未翻译地返回给呼叫者

强调我的。

这与以二进制模式打开文件不同,在二进制模式下,.readlines()文件只会按\n字符分割。对于具有\r行尾或混合行尾的文件,这意味着行将无法正确分割。

演示:

>>> import io
>>> open('test.txt', 'wb').write('One\nTwo\rThree\r\n')
>>> open('test.txt', 'rb').readlines()
['One\n', 'Two\rThree\r\n']
>>> io.open('test.txt', 'r', newline='').readlines()
[u'One\n', u'Two\r', u'Three\r\n']

请注意,io.open()还将文件内容解码为unicode值。