Python限制readlines的换行符()

Gau*_*dha 3 python readlines python-2.7

我试图分裂它采用的新行字符的混合文本LF,CRLFNEL.我需要最好的方法将NEL字符排除在场景之外.

是否有选项可以指示readlines()在分割线条时排除NEL?我或许可以在循环中read()仅进行匹配LFCRLF分割点.

有没有更好的解决方案?

我打开文件codecs.open()打开utf-8文本文件.

在使用时readlines(),它以NEL字符分割:

会话截图

文件内容是:

"u'Line 1 \\x85 Line 1.1\\r\\nLine 2\\r\\nLine 3\\r\\n'"
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 9

file.readlines()只会分开\n,\r\r\n取决于操作系统,如果启用了通用换行支持.

U + 0085 NEXT LINE(NEL)在该上下文中不被识别为换行符,并且您无需执行任何特殊操作即可file.readlines()忽略它.

引用open()功能文档:

Python通常使用通用换行符支持构建; supply 'U'将文件作为文本文件打开,但行可以通过以下任何一种方式终止:Unix行尾约定'\n',Macintosh约定'\r'或Windows约定'\r\n'.所有这些外部表示都被'\n'Python程序看作.如果Python是在没有通用换行符的情况下构建的,'U'则支持模式与普通文本模式相同.需要注意的是文件对象,因此也开有一个属性,叫做换行符其中有没有值(如果没有换行目前尚未看到)'\n','\r','\r\n',或包含所有看到的换行符类型的元组.

通用新行词汇表条目:

一种解释文本流的方式,其中所有以下内容都被识别为一行:Unix行尾约定'\n',Windows约定'\r\n'和旧的Macintosh约定'\r'.参见PEP 278PEP 3116,以及str.splitlines()其他用途.

不幸的是,codecs.open() 打破这个规则; 该文件隐约暗示被问到具体的编解码器:

行尾使用编解码器的解码器方法实现,如果keepends为true ,则包含在列表条目中.

而不是codecs.open()使用io.open()以正确的编码打开文件,然后逐个处理行:

with io.open(filename, encoding=correct_encoding) as f:
    lines = f.open()
Run Code Online (Sandbox Code Playgroud)

io是新的I/O基础架构,完全用Python 3替换Python 2系统.它只处理\n,\r\r\n:

>>> open('/tmp/test.txt', 'wb').write(u'Line 1 \x85 Line 1.1\r\nLine 2\r\nLine 3\r\n'.encode('utf8'))
>>> import codecs
>>> codecs.open('/tmp/test.txt', encoding='utf8').readlines()
[u'Line 1 \x85', u' Line 1.1\r\n', u'Line 2\r\n', u'Line 3\r\n']
>>> import io
>>> io.open('/tmp/test.txt', encoding='utf8').readlines()
[u'Line 1 \x85 Line 1.1\n', u'Line 2\n', u'Line 3\n']
Run Code Online (Sandbox Code Playgroud)

codecs.open()结果是由于使用的代码str.splitlines()被使用,其有一个文档的错误 ; 当拆分unicode字符串时,它会拆分Unicode标准认为是换行符的任何东西(这是一个非常复杂的问题).这种方法的文档没有解释这个; 它声称只根据Universal Newline规则进行拆分.

  • @Gaudha:我现在有时间适当地说出来.`codecs.open()`确实在U + 0085上分裂,而且这种行为充其量*非常糟糕*记录在案.请使用`io.open()`,我已将您链接到受此差异影响的错误报告. (2认同)