質問

テキストファイルには、「これは好きではありません」という文字列があります。

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

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

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

今、文字列に読み込まれるとき、「I don \ xe2 \ x80 \ x98t like」の代わりに「I do n't like this」となるように文字列を読み込むことは可能ですか?これはこのようなものですか?

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

役に立ちましたか?

解決

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

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

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

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

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

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

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

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

  2. unicodedata モジュールの normalize()および string.encode()メソッドを使用して、できる限り変換します次に最も近いASCII相当(Ref 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'
    

他のヒント

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

\ 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として読み取られるようにするには、 open だけでなく codecs.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

しかし、実際には&quot; I don \ u2018t like this&quot; 「これが気に入らない」ではありません。キャラクターu '\ u2018'は&quot; '&quot;とはまったく異なるキャラクターです。 (そして、視覚的には、「 `」にもっと対応する必要があります)。

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

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

ユニコードの句読点ただし、読んでいるドキュメントを作成しているアプリケーションが実際に使用しているのは、そのうちのほんの数個に限られると思います。

テキストファイルが破損しているという事実は別として(U + 2018はアポストロフィではなく左引用符です):iconvを使用して、Unicode文字をASCIIに変換することができます。

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

>>> 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                                     '.

どういうわけか、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

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

>>> test = u"I don\u2018t like this"
>>> test
u'I don\u2018t like this'
>>> print test
I don‘t like this

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

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

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

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

this 文字列を返している場合、ファイルは誤って書き込まれています:

'I don\u2018t like this'

Python 3の読み取りメソッドを使用して、エンコードされたテキストファイルを読み取ることもできます。

f = open (file.txt, 'r', encoding='utf-8')
text = f.read()
f.close()

このバリエーションでは、追加のライブラリをインポートする必要はありません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top