0

Excelファイルからいくつかの単語を読み取り、いくつかの情報を抽出したいと考えています。ファイルの読み取りは問題ありません。

ポイントは、単語の最後の文字をインクリメントしたいということです。「あ」のような普通の文字なら問題ありません。しかし、'Í' のような特殊文字は問題です。

私はこれで内容を読みました:

val = val.encode('utf-8')

この値を辞書に入れました。

次のステップは、dict を繰り返し処理し、保存された情報を取得することです。info['streettype'] には、以前の値が含まれています。今、私はこのように値を大文字に変換します:

w2 = info['streettype'].decode('utf-8').upper().encode('utf-8')

私が言ったように、一部の文字は特別なので、これが必要です (例: 'é'、'ž'、'í')。ここで、単語の最後の文字をインクリメントしたいと思います。これは特殊文字にすることができます。

w3 = w2.decode('utf-8')[:-1].encode('utf-8')    
lastLetter = w2.decode('utf-8')[-1].encode('utf-8')

次に、次を使用して文字をインクリメントします。

lastLetter2 = (chr(ord(lastLetter.decode('utf-8')) + 1))

次に、テキスト ファイルに保存します。元の単語と編集した単語を保存したい。lastLetter2 を再エンコードする必要があると思いますが、うまくいきません。w2 と w3+lastLetter2 を保存すると、エンコードされているものとエンコードされていないものがあるため、奇妙な結果が得られます。

言葉について:

NÁBŘEŽÍ

私の結果は次のとおりです。

"NÃBŘEŽÃ", "NÃBŘEŽÎÃ"

でも私はしたい:

"NÁBŘEŽÍ", "NÁBŘEŽÎ"

(Í は ascii 205、Î は ascii 206)

誰かがこの問題を解決するのを手伝ってくれますか?

4

1 に答える 1

0

データを常に UTF-8 にエンコードするのをやめてください。テキストを Unicode のままにしておくと、処理がはるかに簡単になります。できればファイルオブジェクトにこれをエンコードさせて、エンコーディングを最後まで残してください。

ファイルを Unicode でエンコードするということは、Python 2では標準の組み込み関数io.open()ではなく使用することを意味します。open()これは、Python 3 が Unicode とファイル I/O を処理するために使用するインフラストラクチャと同じです。

ここで自由にエンコードとデコードを行ってモジバケを作成できました。あなたのテキストは、Windows コードページ 1252 でデコードされた UTF-8 データと、再び UTF8 にエンコードされたデータと、マングルされていないデータの混合になっています。

>>> print u'NÃBŘEŽÃ'
NÃBŘEŽÃ
>>> print u'NÃBŘEŽÃ'[3:-1].encode('cp1252').decode('utf8')
ŘEŽ

最初の文字列の最後の文字は無効であることに注意してください。バイトがありません!これは、最後の文字の UTF-8 バイトを「デコード」した結果が、適切な CP1252 コーデックでは可能ではないためです。ftfyその問題を回避するには、プロジェクトの内部修復コーデックを使用する必要がありました。

>>> print u'NÃBŘEŽÃ\x8d'[3:].encode('sloppy-cp1252').decode('utf8')
ŘEŽÍ
>>> u'Í'.encode('utf8').decode('cp1252')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/encodings/cp1252.py", line 15, in decode
    return codecs.charmap_decode(input,errors,decoding_table)
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 1: character maps to <undefined>
>>> u'Í'.encode('utf8').decode('sloppy-cp1252')
u'\xc3\x8d'
>>> print u'Í'.encode('utf8').decode('sloppy-cp1252')
Ã

これを修正する唯一の方法は、a)正しいコーデックを使用してデータを読み取るようにし、b)コード全体ですべてのテキストを Unicode として扱い、最後の瞬間にのみ正しい出力コーデックにエンコードすることです。

ord()and unichr()(Python 2)およびchr()Python 3を使用した Unicode コード ポイントの処理は、期待どおりに機能します。

>>> lastletter = u'Î'
>>> ord(lastletter)
206
>>> unichr(ord(lastletter) + 1)
u'\xcf'
>>> print unichr(ord(lastletter) + 1)
Ï

Python と Unicode について読みたいと思うかもしれません:

于 2015-03-18T12:58:46.963 に答える