我在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?