如何在读取文件时从Python中的行分隔符中排除U + 2028?

时间:2009-07-09 16:44:49

标签: python utf-8 readline separator

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

5 个答案:

答案 0 :(得分:2)

我无法重现这种行为,但这是一个天真的解决方案,它只是合并了读取结果,直到它们不以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

答案 1 :(得分:1)

我无法在mac os x上的python 2.5,2.6或3.0中复制此行为 - U + 2028始终被视为非endline。你能详细了解一下你看到这个错误的位置吗?

那就是说,这里是“文件”类的子类,它可以做你想做的事情:

#/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")

答案 2 :(得分:1)

感谢大家的回答。 我想我知道为什么你可能无法复制这个。我只是意识到如果我在打开时解码文件就会发生这种情况,如:

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")

(我在Windows上使用Python 2.6。该文件最初是UTF16LE,然后转换为UTF8)。

这非常有趣,我想从现在起我将不再使用codecs.open: - )。

答案 3 :(得分:0)

如果您使用Python 3.0(请注意我没有,所以我无法测试),根据documentation,您可以将可选的newline参数传递给open指定要使用的行分隔符。但是,文档根本没有提到U + 2028(它只提到\r\n\r\n作为行分隔符),所以对我来说这甚至是一个惊喜发生(虽然我甚至可以用Python 2.6确认这一点)。

答案 4 :(得分:0)

编解码器模块正在做正确的事情。 U + 2028被命名为“LINE SEPARATOR”,注释“可用于明确地表示此语义”。因此将其视为行分隔符是明智的。

据推测,创作者没有充分的理由就不会把U + 2028字符放在那里......文件是否还有“\ n”?为什么你想要在U + 2028上拆分线?