web-dev-qa-db-ja.com

Pythonのファイルからの文字読み取り

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

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

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

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

さて、文字列に読み込まれるとき、「このようにこのようにしない」ではなく、「私はこれが好きではない」という方法で文字列を読むことは可能ですか?

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

92
Graviton

参照: 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()

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'
    
143
Jay

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

\ u2018文字は、PythonのUnicode文字列の表現の断片としてのみ表示される場合があります。あなたが書く場合:

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

これで、単にユニコード文字列をきれいに印刷したいだけなら、ユニコードの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
15
DzinX

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

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

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

nicodeの句読文字 は非常に多くありますが、読んでいるドキュメントを作成しているアプリケーションが実際に使用しているのはごく少数であると考えられます。

6
Logan

テキストファイルが破損しているという事実はさておき(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                                     '.
3
user3850

どういうわけか、ユニコードのエスケープ文字を含む非ユニコード文字列がある可能性があります、例えば:

>>> 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
2
DzinX

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

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

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

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

this stringを返す場合、ファイルは誤って書き込まれています。

'I don\u2018t like this'
1
John Millikin

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

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

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

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

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

1
Stein