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值。