115

テキスト ファイルに、「I don't like this」という文字列があります。

しかし、文字列に読み込むと「I don\xe2\x80\x98t like this」となります。\u2018 が "'" の Unicode 表現であることは理解しています。私が使う

f1 = open (file1, "r")
text = f1.read()

読み取りを行うコマンド。

さて、文字列に読み込まれたときに、「I don\xe2\x80\x98t like this like this」ではなく、「I don't like this」となるような方法で文字列を読み取ることは可能ですか?

2番目の編集:この問題を解決するためにマッピングを使用する人を見てきましたが、実際には、この種の ANSI から Unicode (およびその逆) への変換を行う組み込みの変換はありませんか?

4

9 に答える 9

180

参照: http://docs.python.org/howto/unicode

したがって、ファイルから Unicode を読み取るのは簡単です。

import codecs
with codecs.open('unicode.rst', encoding='utf-8') as f:
    for line in f:
        print repr(line)

ファイルを更新モードで開いて、読み取りと書き込みの両方を許可することもできます。

with codecs.open('test', encoding='utf-8', mode='w+') as f:
    f.write(u'\u4500 blah blah blah\n')
    f.seek(0)
    print repr(f.readline()[:1])

EDIT:あなたの意図した目標は、Pythonでファイルを文字列に正しく読み取ることができるようにすることだけだと思います。Unicode から ASCII 文字列に変換しようとしている場合、Unicode 文字が必ずしも ASCII に存在するとは限らないため、変換する直接的な方法は実際にはありません。

ASCII 文字列に変換しようとしている場合は、次のいずれかを試してください。

  1. この特定の例のようないくつかの特殊なケースのみを処理する場合は、特定の Unicode 文字を同等の ASCII 文字に置き換えます。

  2. unicodedataモジュールnormalize()とメソッドを使用string.encode()して、次に近い ASCII にできる限り変換します (参照https://web.archive.org/web/20090228203858/http://techxplorer.com/2006/07/18/converting- Unicode-to-ascii-using-python ):

    >>> teststr
    u'I don\xe2\x80\x98t like this'
    >>> unicodedata.normalize('NFKD', teststr).encode('ascii', 'ignore')
    'I donat like this'
    
于 2008-09-29T06:55:23.980 に答える
15

考慮すべき点がいくつかあります。

\u2018 文字は、Python の Unicode 文字列の表現の一部としてのみ表示される場合があります。たとえば、次のように記述した場合です。

>>> text = u'‘'
>>> print repr(text)
u'\u2018'

単純に Unicode 文字列をきれいに出力したい場合は、Unicode のencodeメソッドを使用してください:

>>> text = u'I don\u2018t like this'
>>> print text.encode('utf-8')
I don‘t like this

任意のファイルのすべての行が Unicode として読み取られるようにするには、ファイルのエンコーディングを指定できるようにするcodecs.openだけでなく、関数を使用することをお勧めします。open

>>> import codecs
>>> f1 = codecs.open(file1, "r", "utf-8")
>>> text = f1.read()
>>> print type(text)
<type 'unicode'>
>>> print text.encode('utf-8')
I don‘t like this
于 2008-09-29T07:15:17.630 に答える
6

しかし、それは「私はこれが好きではない」であり、「私はこれが好きではない」ではありません. 文字 u'\u2018' は、"'" とは完全に異なる文字です (視覚的には、'`' に対応する必要があります)。

エンコードされた Unicode をプレーンな ASCII に変換しようとしている場合、おそらく ASCII に変換したい Unicode 句読点のマッピングを保持できます。

punctuation = {
  u'\u2018': "'",
  u'\u2019': "'",
}
for src, dest in punctuation.iteritems():
  text = text.replace(src, dest)

ただし、 unicode には非常に多くの句読点文字がありますが、読んでいるドキュメントを作成しているアプリケーションで実際に使用されているのはそのうちのいくつかだけであると期待できます。

于 2008-09-29T07:00:40.660 に答える
3

テキストファイルが壊れているという事実は別として(U + 2018は左引用符であり、アポストロフィではありません):iconvを使用して、Unicode文字をASCIIに音訳することができます。

モジュールはもうサポートされていないようで、正規のホームページが見つからないため、「iconvcodec」をグーグルで検索する必要があります。

>>> import iconvcodec
>>> from locale import setlocale, LC_ALL
>>> setlocale(LC_ALL, '')
>>> u'\u2018'.encode('ascii//translit')
"'"

または、iconvコマンドラインユーティリティを使用してファイルをクリーンアップすることもできます。

$ xxd foo
0000000: e280 980a                                ....
$ iconv -t 'ascii//translit' foo | xxd
0000000: 270a                                     '.
于 2008-09-30T20:10:54.873 に答える
3

どういうわけか、Unicode エスケープ文字を含む非 Unicode 文字列を持っている可能性があります。

>>> print repr(text)
'I don\\u2018t like this'

これは実際に私に一度起こったことです。コーデックを使用しunicode_escapeて文字列を Unicode にデコードし、それを任意の形式にエンコードできます。

>>> uni = text.decode('unicode_escape')
>>> print type(uni)
<type 'unicode'>
>>> print uni.encode('utf-8')
I don‘t like this
于 2008-09-29T07:22:21.233 に答える
1

実際、U+2018 は特殊文字 ' の Unicode 表現です。必要に応じて、次のコードを使用して、その文字のインスタンスを U+0027 に変換できます。

text = text.replace (u"\u2018", "'")

さらに、ファイルの書き込みに何を使用していますか? f1.read()次のような文字列を返す必要があります。

'I don\xe2\x80\x98t like this'

この文字列を返す場合、ファイルは正しく書き込まれていません。

'I don\u2018t like this'
于 2008-09-29T06:52:53.037 に答える
1

これは、Unicode でエンコードされた文字列を表示する Python の方法です。しかし、問題なく文字列を画面に出力したり、新しいファイルに書き込んだりできるはずです。

>>> test = u"I don\u2018t like this"
>>> test
u'I don\u2018t like this'
>>> print test
I don‘t like this
于 2008-09-29T06:54:22.627 に答える