UTF-8 のファイルがあり、一部の行には U+2028 行区切り文字 ( http://www.fileformat.info/info/unicode/char/2028/index.htm ) が含まれています。ファイルから行を読み取るときに改行として扱われたくありません。ファイルを反復処理するとき、または readlines() を使用するときに、セパレーターから除外する方法はありますか? (ファイル全体を文字列に読み取り、\n で分割する以外に。) ありがとうございます。
5 に答える
この動作を mac os x の python 2.5、2.6、または 3.0 で複製することはできません - 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")
答えてくれたみんなに感謝します。なぜこれを複製できなかったのかはわかっていると思います。次のように、開いたときにファイルをデコードすると発生することに気づきました。
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をあまり使用しないと思います:-)。
コーデックモジュールは正しいことをしています。U + 2028の名前は「LINESEPARATOR」で、「このセマンティクスを明確に表すために使用できます」というコメントが付いています。したがって、それを行区切り文字として扱うことは賢明です。
おそらく、作成者は正当な理由なしにU +2028文字をそこに配置しなかったでしょう...ファイルにもu"\n"がありますか?U + 2028で行が分割されないようにするのはなぜですか?
Python 3.0を使用している場合(私は使用していないため、テストできません)、ドキュメントによると、オプションのnewline
パラメーターをopen
に渡して、使用する行区切り記号を指定できます。ただし、ドキュメントにはU + 2028についてはまったく記載されていません(、、、および行区切り文字としてのみ記載\r
さ\n
れています\r\n
)。したがって、これが発生することは実際には驚きです(Python 2.6でも確認できます)。