44

PythonでUnicode文字列インジケータをグローバルに抑制する方法はありますか?私はアプリケーション内でUnicodeを使って排他的に作業していて、たくさんのインタラクティブなことをしています。私のすべてのデバッグ出力にu'prefix 'が表示されるようにすることは、不要で厄介です。オフにできますか?

11 답변


40

Python 3.0を使うことができます。デフォルトの文字列型はUnicodeです。u''接頭辞は不要になりました。

一言で言えば、いいえ。これを無効にすることはできません。

uから来るunicode.__repr__REPLで内容を表示するために使用されるメソッド。

>>> print repr(unicode('a'))
u'a'
>>> unicode('a')
u'a'

私が誤解していなければ、Pythonを再コンパイルせずにこれを上書きすることはできません。

これを回避する最も簡単な方法は、単に文字列を印刷することです。

>>> print unicode('a')
a

あなたが使用する場合unicode()すべての文字列を構築するように組み込まれているので、次のようなことができます。

>>> class unicode(unicode):
...     def __repr__(self):
...             return __builtins__.unicode.__repr__(self).lstrip("u")
... 
>>> unicode('a')
a

..それをしないでください、それは恐ろしいです。


  • これは他にはない良い解決方法です。本当の答えはそれを吸うことです! - Ryan
  • Python 3の文字列を学ぶための+1はデフォルトですべてUnicodeです - notbad.jpeg

26

HTMLテンプレートの一部としてpythonを使用してJavaScriptを設定していたため、uプレフィックスを削除する必要がある場合がありました。簡単な出力では、辞書キーのためにu接頭辞を残しました。

var turns = [{u'armies':2...];

JavaScriptを壊します。

必要な出力Javascriptを取得するために、私は私のために文字列をエンコードするのにjson pythonモジュールを使用しました:

turns = json.dumps(turns)

これは私の特定のケースではうまくいきますが、キーはすべてASCIIなので、エンコードについて心配する必要はありません。あなたはおそらくあなたのデバッグ出力にこのトリックを使用することができます。


  • 素晴らしい、json.dumps()は再帰的repr()のように。 1つの注意点辞書キーintからstrに変換されます。assert '{"3": 5}' == json.dumps({3:5})(JavaScriptオブジェクトプロパティが識別子すべて文字列です。 - Bob Stein

7

使うstr( text )あなたのPythonのデフォルトエンコーディングと文字列の正確な内容の両方について100%確信が持てないときはいつでも、実際にはやや悪い考えです - 後者はインターネットから取り出されたテキストのために典型的でしょう。また、やりたいことに応じて、print text.encode( 'utf-8' )またはprint repr( text.encode( 'utf-8' ) )次のような読めないコードポイントでレンダリングがいっぱいになる可能性があるため、期待外れの結果が生じる可能性があります。\x3a

私は最適なのは本当にUnicode対応のコマンドライン(ウィンドウズの下では難しい、Linuxの下では簡単)を利用してpython 2.xからpython 3.xに切り替えることであると思います。新しいpython 3シリーズによってもたらされるテキスト対バイト処理の容易さと明瞭さは、本当に期待できる大きな利点の1つです。これは 'bytes'と 'text'の区別を学ぶために少し時間をかけて文字エンコーディングの概念を理解する必要があることを意味しますが、その時間はpython 3環境ではこれらに対するpythonの新しいアプローチとしてはるかによく使われます。厄介な問題は、python 2が提供しなければならなかったものよりもはるかに明確でエラーが起こりにくいものです。私はこれまで振り返ってみると問題のあるユニコードへのpython 2のアプローチを呼ぶことにしましたが、私はそれを優れたものと考えていました---この問題がphpで処理される方法

編集する私は立ち寄った関連ディスカッションここでSOについて、最近のphpがUnicode /エンコーディングの問題に取り組むように思われる方法についてのこのコメントを見つけました:

それはマウスが食べようとしているようなものです   象。 Unicodeを   ASCIIの拡張子   文字列、そしてmb_strings)   間違ったやり方で物事を進めます。   特別なケースが何であるかにハングアップする   で文字を扱うために必要   より多くを必要とするおかしいsquiggles   1バイトUnicodeをとして扱うなら   抽象的な空間を提供する   必要な文字、ASCIIは   何の必要もなくその中に収容   特別な場合として扱います。

私の経験では、SO python + unicodeの全トピックの90%は、ASCIIやlatin-1で晴れていた人々から来ているように思われるので、これをここで引用します。それから基本的にそれを取り除きたいだけです。 python 3に切り替えるときにすることはまさに上記のコメント投稿者がすることを示唆していることです:Unicodeをasciiの厄介な拡張として見る代わりに、あなたはサブセットとしてascii(そしてあなたが遭遇する他のほとんどすべてのエンコーディング)を見るようになりますUnicodeの)。

確かに、Unicode v6は確かにエンコーディングの最後の単語ではありませんが、2011年にあなたが得ることができるのと同じくらい普遍的なものに近いです。それに慣れてください。


7

from __future__ import unicode_literals

Python 2.6(2008年10月1日リリース)以降に利用可能です。 Python 3ではデフォルトです。

省略することができますu''変更されませんが、ソースコードに接頭辞を付けます。repr(unicode_string)それは誤解を招くでしょう。

あなたは上書きすることができますsys.displayhook()PythonのREPLでは、オブジェクトを表示するのは好きです。上書きすることもできます__repr__あなた自身のカスタムオブジェクトのために。


  • から未来unicode_literalsをインポートしても、Python 2.7で動作しない - Alex Luya
  • @AlexLuyaは動作します(はい、確認するために試しました)。やってみるtype("")新鮮なPython REPLでは、あなたは見るべきです<type 'str'>。次に実行します。from __future__ import unicode_literalsそして繰り返すtype("")。今、あなたは見るべきです<type 'unicode'>。あなたの環境は何ですか(OS、pythonバージョン)? - jfs
  • Ubuntu + ipython + python 2.7 - Alex Luya
  • type("")は" unicode"を取得しましたが、nltk.corpus import stopwords"から" print stopwords.words(" english")"、' u'&# 39;接頭辞が付きます - Alex Luya
  • @AlexLuyaそれは私のために動作し、ドキュメントはそれが動作するはずであることを明示的に言う:"インタラクティブインタープリタのプロンプトで入力された将来のステートメントは、インタープリタセッションの残りの部分で有効になります。 - jfs

4

これは大域的なオプションではないことを私は知っていますが、文字列をstr()関数に入れることでUnicode uを抑制することもできます。

そのため、Unicode派生リストは次のようになります。

>>> myList=[unicode('a'),unicode('b'),unicode('c')]
>>> myList
[u'a', u'b', u'c']

これになるだろう:

>>> myList=[str(unicode('a')),str(unicode('b')),str(unicode('c'))]
>>> myList
['a', 'b', 'c']

少し面倒ですが、誰かに役立つかもしれません


  • ちょっと、あなた!この「配列内」をありがとうございます。文字列の作成 - itsricky
  • 私は解析のためにこのデータをPHPに渡すことを試みています、そしてそれはPHPでこの変換を扱うことを試みることをとても混乱させました。私は2年間の命を失った。私は' stories.append(word)'を使用していましたが、これをあなたの魔法の' stories.append(str(unicode(word)))'に変更しました。そしてそのすべてがソートされました。見事な@electrice! - itsricky
  • ええと、絶対に**絶対に**これをしないでください - それは非ASCIIデータでクラッシュし、最初の場所でUnicodeを使用するという全体の目的を打ち負かします。持っていないことに頼っている場合uどこかで、あなたはひどい間違ったことをしています。 @itsricky、あなたはおそらくPHPでPython reprをパースしようとしているのではなく、JSONにエンコードしたいと思うでしょう! - Eevee
  • UPVOTE LIMITに達しましたが、Electriceに感謝しなければなりませんでした。 - Mona Jalal
  • よく働く!!! - gsamaras

4

念のためにあなたがこのようなものを得ているu['hello']それならあなたは配列を印刷しなければなりません。印刷するstr(arr[0])そしてあなたは行ってもいいです。


3

ユニコードではわかりませんが、一般的にあなたは呼び出すことができますstr.encode()より適切な形式に変換します。たとえば、Python 3.0以降でキャプチャされたサブプロセスの出力は、それをバイトストリーム(接頭辞 'b')としてキャプチャし、encode()は通常の文字列形式に修正します。


3

私のために働いているようです:

import ast
import json
j = json.loads('{"one" : "two"}')
j
dd = {u'one': u'two'}
dd
# to get double quotes
json.dumps(j,  encoding='ascii')
json.dumps(dd, encoding='ascii')
# to get single quotes
str(ast.literal_eval(json.dumps(j,  encoding='ascii')))
str(ast.literal_eval(json.dumps(dd, encoding='ascii')))

出力:

>>> {u'one': u'two'}
>>> {u'one': u'two'}
>>> '{"one": "two"}'
>>> '{"one": "two"}'
>>> "{'one': 'two'}"
>>> "{'one': 'two'}"

自明のとおり、上記は辞書およびJSONオブジェクトに対して機能します。

単なる文字列の場合は、str()でラップするとうまくいくようです。

s=u'test string'
s
str(s)

出力:

>>> u'test string'
>>> 'test string'

Pythonバージョン:2.7.12


1

以下を試してください

str(result.url)を表示します。

デフォルトのエンコーディングが変更された可能性があります。

あなたは以下であなたのデフォルトエンコーディングをチェックすることができます: -

> import sys
> print sys.getdefaultencoding()
> ascii

デフォルトはasciiであるべきで、これはu'string 'が' string 'として表示されるべきだがあなたのものが変更されたかもしれないことを意味します。


  • 完璧です!ありがとう。 - Nik
  • @Nik:これがあなたの質問に答えた場合、正しい答えとしてそれをマークしてください。 - XORcist

1

あなたが使用する必要がありますprint str(your_Variable)


1

Python 3に更新したくない場合は、部分文字列を利用することができます。 たとえば、元の出力が(u'mystring '、)だったとします。例として、変数rowにunicode接頭辞のない "mystring"という文字列が含まれているとしましょう。それからあなたはこのような何かをしたいでしょう:

temp = str(row); #str is not necessary, but probably good practice
temp = temp[:-3];
print = temp[3:];

リンクされた質問


関連する質問

最近の質問