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

Pro*_*020 10 python file-io line-endings python-2.7

with open(fn, 'rt') as f:
    lines = f.readlines()
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ers 19

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

import io

with io.open(fn, 'rt', newline='') as f:
    lines = f.readlines()
Run Code Online (Sandbox Code Playgroud)

设置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']
Run Code Online (Sandbox Code Playgroud)

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

  • @cxxl:这个问题是特定于Python 2.x的,是的,内置的`open`是不相同的函数。在Python 3.x中,io.open和open是完全相同的函数。 (2认同)