Python,使用CRLF读取CRLF文本文件

时间:2013-12-03 11:47:01

标签: python python-2.7 file-io line-endings

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

这将读取带有LF行结束的CR LF文本文件(WinXP,Py 2.6)。所以lines包含'\ n'末尾。如何获得行:

  • 对于CRLF文件获取带有'\ n \ r'结束的行
  • 用于LF文件获取带有'\ n'的行

1 个答案:

答案 0 :(得分:18)

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

import io

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

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

  

在输入时,如果换行符为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值。