web-dev-qa-db-ja.com

python文字列でUnicodeを示すu'prefixを抑制します

Pythonでユニコード文字列インジケータをグローバルに抑制する方法はありますか?私はアプリケーションでユニコードを排他的に使用しており、多くのインタラクティブなことをしています。デバッグ出力のすべてにu'prefix 'が表示されることは、不要で不快です。オフにすることはできますか?

46
Ryan

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
_

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

40
dbr

python htmlテンプレートの一部としてjavascriptをセットアップしていたため、uプレフィックスを削除する必要がある場合がありました。

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

javascriptが壊れます。

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

turns = json.dumps(turns)

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

28
Paul Whipp
_from __future__ import unicode_literals
_

Python 2.6(2008年10月1日にリリース))。Python 3。

ソースコードで_u''_プレフィックスを省略できますが、誤解を招くrepr(unicode_string)は変更されません。

Python REPL)でsys.displayhook()をオーバーライドして、オブジェクトを好きなように表示できます。独自のカスタムオブジェクトに対して___repr___をオーバーライドすることもできます。

8
jfs

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

ユニコード対応のコマンドライン(Windowsでは難しい、Linuxでは簡単)を利用して、python 2.xからpython 3.xに切り替えることが最適だと思います。新しいpython 3シリーズによって提供されるテキストとバイトの処理の容易さと明確さは、実際に期待できる大きな利点の1つです。つまり、「バイト」と「テキスト」の区別を学習し、文字エンコードの概念を把握するために少し時間を費やす必要がありますが、その時間はpython 3環境で費やすほうがはるかに優れています。これらの厄介な問題に対するpythonの新しいアプローチは、python 2が提供しなければならなかったものよりもはるかに明確であり、エラーが発生しにくいためです。レトロスペクティブで問題のあるユニコードへのpython 2のアプローチを呼び出すまで行きますが、以前は優れていると考えていましたが、---と比較すると この問題はphp で処理されます。

edit私はちょうど 関連する議論 ここSOに立ち寄って、そのコメントを見つけました最近のphpは、ユニコード/エンコードの問題に取り組んでいるようです:

象を食べようとしているネズミのようなものです。ユニコードをASCIIの拡張としてフレーミングすることにより(通常の文字列とmb_stringsがあります)、間違った方法で物事を回避し、面白い波線を持つ文字を処理するために必要な特別な場合にハングアップします1バイト以上必要です。 Unicodeを、必要な文字に抽象スペースを提供するものとして扱う場合、ASCIIは、特殊なケースとして扱う必要なく、その中に収容されます。

私の経験では、すべてのSO python + unicodeトピックの90%がasciiや多分latin-1で元気だった人々から来ているように見えるので、これを引用します。通常の設定でサポートされており、基本的にはそれを取り除きたいだけです。 python 3に切り替えるときに行うことは、上記のコメンターが行うことを示唆していることです。Unicodeをasciiの厄介な拡張として表示する代わりに、ascii(および他のほとんどすべてのエンコーディング)を表示し始めますユニコードのサブセットとして).

確かに、Unicode v6はエンコーディングの最後のWordではありませんが、2011年に入手できるユニバーサルに近いものです。慣れてください。

7
flow

この_u['hello']_のようなものを取得する場合に備えて、配列を出力する必要があります。 str(arr[0])を印刷して、準備完了です。

4
user3526

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

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

4
tautology

これはグローバルなオプションではないことは知っていますが、文字列を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']

少し面倒ですが、誰かにとっては便利かもしれません

4
Electrice

Unicodeではわかりませんが、一般的にstr.encode()を呼び出して、より適切な形式に変換できます。たとえば、Python 3.0+でキャプチャされたサブプロセス出力は、バイトストリーム(プレフィックス 'b')としてキャプチャし、encode()は通常の文字列形式に修正します。

3
AK.

Python 3に更新したくない場合は、部分文字列を使用できます。たとえば、元の出力が(u'mystring '、)だったとしましょう。この例では、変数行にユニコードプレフィックスのない「mystring」文字列が含まれているため、次のような操作を行います。

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

以下をお試しください

印刷str(result.url)

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

以下を使用して、デフォルトのエンコードを確認できます。

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

デフォルトはasciiである必要があります。つまり、u'string 'は' string 'として出力されますが、変更されている可能性があります。

1
Martin

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

1
Nasser Hadjloo