2009-11-06 11 views
5

PML(Palm Markup Language)ファイルを修正しようとすると、テストファイルに非ASCII文字が含まれているため、MakeBookがエラーを発するように見えます。解決策は、PML内のすべての非ASCII文字を取り除くことです。Pythonを使って拡張asciiを削除するには?

だからpythonでこの問題を解決しようとする中で、私は

import unicodedata, fileinput 

for line in fileinput.input(): 
    print unicodedata.normalize('NFKD', line).encode('ascii','ignore') 

を持っているが、これはラインが「ユニコードではなく、STR」でなければならないというエラーになります。ここにファイルの断片があります。

\B1a\B \tintense, disordered and often destructive rage†.†.†.\t 

この時点で正しく処理するにはラインを正しく渡す方法が不明です。

+0

あなたは、そのASCII値が255よりも大きい任意の文字をフィルタリングしますか? –

+0

厳密に言うと、拡張ASCIIのようなものはありません。 ASCIIは0〜127の値を定義します。それより高いものは任意にしか解釈できません。おそらく* ASCII以外の文字*という用語を使うべきでしょう。 – dreamlax

+0

関連:ターミナル出力の安全エスケープ機能http://stackoverflow.com/questions/437476/safe-escape-function-for-terminal-output – jfs

答えて

0

Pythonのファイルから読み込むときは、Python 2.x以前ではバイト文字列を取得しています(別名「str」)。 decodeメソッドを使用して、これらを「unicode」タイプに変換する必要があります。例:

line = line.decode('latin1') 

'latin1'を正しいエンコードに置き換えます。

5

試してみてください。print line.decode('iso-8859-1').encode('ascii', 'ignore') - あなたが望むものにはるかに近いはずです。

+0

これは動作しているようですが、現在MakeBookは違法な制御コードについて不平を言っています。 –

+0

@ Jauder、もちろん、上記の 'clean = ''の後など、制御コードを削除することもできます。(改行と復帰を含むすべてのコントロールコードを削除する - 好みに合わせて、あなたがしたいコントロールコードを知らずに本当にあなたのためにすることはできません。削除! - )。 –

+0

@Alex、私が知っていれば、私は=)。問題は、ソースがなくてもJavaプログラムで作業しているだけで、わかりにくいエラーメッセージが出るだけです。 http://gist.github.com/227882 –

5

あなたはASCIIエンコードされたデータとしてlineを扱うしたいと思いますので、答えはアスキーコーデックを使用してテキストにそれを解読することです:

line.decode('ascii')

これは実際にはないデータのためにエラーが発生しますASCIIエンコードされます。これは、これらのエラーを無視する方法です。

line.decode('ascii', 'ignore')

これは、unicodeインスタンスの形式のテキストを提供します。あなたではなくテキストではなく(ASCIIでエンコードされた)データを扱うならば、あなたはそれが(パイソンのバージョンによって異なります)strまたはbytesインスタンスを取り戻すために再エンコードしてもよい:

line.decode('ascii', 'ignore').encode('ascii')

2

削除するには非ASCII文字はline.decode(your_file_encoding).encode('ascii', 'ignore')を使用します。しかし、おそらくあなたはより良い彼らのためにPLMのエスケープシーケンスを使用したい:

import re 

def escape_unicode(m): 
    return '\\U%04x' % ord(m.group()) 

non_ascii = re.compile(u'[\x80-\uFFFF]', re.U) 

line = u'\\B1a\\B \\tintense, disordered and often destructive rage\u2020.\u2020.\u2020.\\t' 
print non_ascii.sub(escape_unicode, line) 

これは\B1a\B \tintense, disordered and often destructive rage\U2020.\U2020.\U2020.\tを出力します。

正規表現で非ASCIIおよび制御文字を削除することはあまりにも簡単です(これは安全に脱出した後に使用することができます):

regexp = re.compile('[^\x09\x0A\x0D\x20-\x7F]') 
regexp.sub('', line) 
関連する問題