我有一個UTF-8文件,其中一些行包含U + 2028行分隔符(http://www.fileformat.info/info/unicode/char/2028/index.htm)。當我讀取文件中的行時,我不希望它被視爲換行符。當我迭代文件或使用readlines()時,是否有辦法將它從分隔符中排除? (除了將整個文件讀入字符串,然後按\ n分割)。謝謝!如何在讀取文件時從Python的行分隔符中排除U + 2028?
回答
我不能在mac os上的python 2.5,2.6或3.0中複製此行爲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")
有人更好的python unicode的知識,是這條線是正確的: `if nextLine.decode(「utf8」)[ - 1] == u'\ u2028':` 我得到一個警告沒有解碼聲明,跟着爲什麼。 – Markus 2009-07-09 21:28:52
我不知道你得到了什麼樣的錯誤信息,但是通常如果這行包含非ASCII字符,那麼在它被任何其他操作處理之前,它必須首先解碼成'unicode字符串'。所以它通常是1.解碼,2.做東西的字符串,3.在寫入文件之前編碼,在處理utf文件時。 – user135773 2009-07-09 22:09:23
如果您使用Python 3.0(注意,我沒有,所以我無法測試),根據documentation你可以通過一個可選的newline
參數open
到specifify使用哪行分隔符。然而,這個文檔根本沒有提到U + 2028(它只提到\r
,\n
和\r\n
作爲行分隔符),所以對我來說這實際上讓我感到奇怪,甚至發生了這種情況(儘管我甚至可以用Python 2.6來證實這一點) 。
我無法重現這種行爲,但這是一個天真的解決方案,只是合併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
感謝大家的回答。 我想我知道爲什麼你可能沒有能複製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應按然後將其轉換爲UTF-8)。
這非常有趣,我想我現在不會使用codecs.open :-)。
編解碼器模塊正在做正確的事情。 U + 2028被命名爲「LINE SEPARATOR」,註釋「可以用來明確表示這個語義」。所以把它當作線路分隔符是明智的。
據推測,創作者不會在沒有充分理由的情況下將U + 2028字符放在那裏......該文件是否也有u「\ n」?爲什麼你不想在U + 2028上劃線?
爲什麼不移動到U + 2028並丟棄CR/LF的恐龍? – 2014-12-11 16:38:26