5

PML(Palm Markup Language)ファイルを修正しようとすると、テストファイルに非ASCII文字が含まれているように見え、MakeBookが文句を言います。解決策は、PML内のすべての非ASCII文字を取り除くことです。

だから、Pythonでこれを修正しようとすると、私は

import unicodedata, fileinput

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

ただし、これにより、行が「strではなくunicode」である必要があるというエラーが発生します。これがファイルの断片です。

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

この時点で処理するためにラインを適切に渡す方法がよくわかりません。

4

4 に答える 4

5

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

于 2009-11-06T06:08:21.393 に答える
4

ASCII エンコードされたデータとして扱いたいlineので、答えは ascii コーデックを使用してテキストにデコードすることです。

line.decode('ascii')

これにより、実際には ASCII でエンコードされていないデータに対してエラーが発生します。これらのエラーを無視する方法は次のとおりです。

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

これにより、unicodeインスタンスの形式でテキストが得られます。テキストではなく (ASCII エンコードされた) データで作業したい場合は、再エンコードしてstrまたはbytesインスタンスを取得できます (Python のバージョンによって異なります)。

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

于 2009-11-06T06:17:55.403 に答える
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)
于 2009-11-06T11:02:05.180 に答える
0

Pythonでファイルから読み取ると、Python2.x以前では「str」とも呼ばれるバイト文字列が取得されます。メソッドを使用して、これらを「unicode」タイプに変換する必要がありますdecode。例えば:

line = line.decode('latin1')

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

于 2009-11-06T06:04:09.160 に答える