如何从Python中的行分隔符读取文件时不包括U + 2028?(How to exclude U+

2019-09-18 03:52发布

我在UTF-8的文件时,其中一些行包含U + 2028行分隔符字符( http://www.fileformat.info/info/unicode/char/2028/index.htm )。 我不希望它被视为一个换行符,当我从文件中读取行。 有没有办法从分隔符)排除它,当我遍历文件或使用readlines方法(? (除了通过的\ n整个文件读入一个字符串,然后分割。)谢谢!

Answer 1:

我不能在Python 2.5,2.6或3.0重复这种行为在Mac OS X - U + 2028总是被视为非底线。 你可以进入更详细的关于您看到这个错误?

这就是说,这里是“文件”类,可能做你想做的子类:

#/usr/bin/python
# -*- coding: utf-8 -*-
class MyFile (file):
    def __init__(self, *arg, **kwarg):
        file.__init__(self, *arg, **kwarg)
        self.EOF = False
    def next(self, catchEOF = False):
        if self.EOF:
            raise StopIteration("End of file")
        try:
            nextLine= file.next(self)
        except StopIteration:
            self.EOF = True
            if not catchEOF:
                raise
            return ""
        if nextLine.decode("utf8")[-1] == u'\u2028':
            return nextLine+self.next(catchEOF = True)
        else:
            return nextLine

A = MyFile("someUnicode.txt")
for line in A:
    print line.strip("\n").decode("utf8")


Answer 2:

我无法重现该行为,但这里只是合并readline的结果,直到它们不与U + 2028结束天真的解决方案。

#!/usr/bin/env python

from __future__ import with_statement

def my_readlines(f):
  buf = u""
  for line in f.readlines():
    uline = line.decode('utf8')
    buf += uline
    if uline[-1] != u'\u2028':
      yield buf
      buf = u""
  if buf:
    yield buf

with open("in.txt", "rb") as fin:
  for l in my_readlines(fin):
    print l


Answer 3:

感谢大家的回答。 我想我知道为什么你可能没有能复制this.I刚刚意识到它发生,如果我打开的时候,在解码文件:

f = codecs.open(filename, encoding='utf-8')
for line in f:
    print line

该线不分开的u2028,如果我先打开该文件,然后解码各条线:

f = open(filename)
for line in f:
    print line.decode("utf8")

(我使用Python 2.6在Windows上,该文件最初是utf16le应按然后将其转换成UTF8)。

这是很有意思的,我想我不会使用codecs.open多从现在开始:-)。



Answer 4:

如果您使用Python 3.0(注意,我没有,所以我无法测试),根据文件 ,你可以传递一个可选的newline参数来open到specifify使用哪行分隔符。 然而,该文件没有提到U + 2028在所有(它只提到\r\n\r\n作为行分隔符),所以它实际上是一个惊喜,我认为这甚至出现(虽然我可以证实这一点甚至与Python 2.6)。



Answer 5:

编解码器模块做正确的事。 U + 2028被命名为“行分隔符”与评论“可以被用来明确表示此语义”。 因此,将它视为行分隔符是明智的。

据推测,创作者将不会把U + 2028个字符,有没有很好的理由...没有文件具有u“\ n”呢? 你为什么想不放在U + 2028分割线?



文章来源: How to exclude U+2028 from line separators in Python when reading file?