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