Python:json.loadsは「u」で始まるアイテムを返します


161

私はObj-CからJSONエンコードされた文字列を受け取り、以下のコードのように(今のところ)ダミー文字列をデコードしています。私の出力は、各アイテムの前に文字「u」が付いて出てきます:

[{u'i': u'imap.gmail.com', u'p': u'aaaa'}, {u'i': u'333imap.com', u'p': u'bbbb'}...

JSONはこのユニコード文字をどのように追加しますか?それを削除する最良の方法は何ですか?

mail_accounts = []
da = {}
try:
    s = '[{"i":"imap.gmail.com","p":"aaaa"},{"i":"imap.aol.com","p":"bbbb"},{"i":"333imap.com","p":"ccccc"},{"i":"444ap.gmail.com","p":"ddddd"},{"i":"555imap.gmail.com","p":"eee"}]'
    jdata = json.loads(s)
    for d in jdata:
        for key, value in d.iteritems():
            if key not in da:
                da[key] = value
            else:
                da = {}
                da[key] = value
        mail_accounts.append(da)
except Exception, err:
    sys.stderr.write('Exception Error: %s' % str(err))

print mail_accounts

7
Pythonはここで問題を抱えています。すべてが悪寒ではありません。これらの文字列をファイルに書き込もうとすると、Pythonが作成する文字列にエラーが発生します。たとえば、PythonがJSONから "53"を取得すると、それはu'53 'に変換され、それを16進文字u' \ xe1 'としてファイルに書き込もうとします。これにより、Pythonは完全に適切な文字列を取得し、それに吐き出します。JSON: {"sa_BstDeAv": "53"、 "sa_BwVUpMx" ... PYTHON:{u'sa_BstDeAv ':u'53'、u'sa_BwVUpMx '...書き込みエラー:値エラー(' ascii 'コーデックはエンコードできません位置5の文字u '\ xe1':序数が範囲外(128))
David Urry

@janehouseここでの正しい答えはjdiの答えです。本当に変更する必要があると思います。
2017

回答:


168

u-接頭辞は、Unicode文字列があることを意味します。文字列を実際に使用する場合、データには表示されません。印刷出力によってスローされません。

たとえば、これを試してください:

print mail_accounts[0]["i"]

uは表示されません。


5
あなたの答えは、私が得た最も有用なものだった、と私はこの質問のアスカーが実際にそれを高く評価していると思います:stackoverflow.com/questions/956867/...
jimh

1
どうもありがとうございます !私は長い間uの手紙に戸惑いました
ケタン・カンダガレ

コピーして貼り付ける場合を除いuて、データには大量のが含まれます。正直なところ、uUnicode文字列であることを示すためにa を出力することは、Pythonの最悪の誤りの1つです。まったくばかげています。aASCIIの場合、すべての文字列の前に出力しないのはなぜですか?i整数の場合はどうでしょうか?
スノークラッシュ

Python 2では、Unicode文字列はバイト文字列とは異なるタイプであるため、データのreprにはそれを示す接頭辞が含まれています。内容がどうなるかではなく、タイプについてです。内容をPythonプログラムに貼り付ける場合は、接頭辞uで問題ありません。そうでない場合は、代わりにjson.dumps()を使用することをお勧めします。
Ned Batchelder 2018

jsonの辞書を検索するには、文字列を使用する必要があります。ただし、ドット演算子は使用できません。
マドックス

151

すべてがクールです。'u'は良いことです。これは、Python 2.xでは文字列がUnicodeタイプであることを示しています。

http://docs.python.org/2/howto/unicode.html#the-unicode-type


71
私はこれのとても冷たいトーンが好きです。私を笑顔にした(正解)回答の+1。
mgilson

19
ただ、寒さ...(┛◉Д◉)┛彡┻━┻
フルビオ

31
それがStackOverflowで読んだ中で最もリラックスした答えでした。
aanrv 2017年

3
☮☮☮平和☮☮☮
sr9yar

54

d3以下印刷はあなたが探しているものです(これはダンプとロードの組み合わせです):)

持つ:

import json

d = """{"Aa": 1, "BB": "blabla", "cc": "False"}"""

d1 = json.loads(d)              # Produces a dictionary out of the given string
d2 = json.dumps(d)              # Produces a string out of a given dict or string
d3 = json.dumps(json.loads(d))  # 'dumps' gets the dict from 'loads' this time

print "d1:  " + str(d1)
print "d2:  " + d2
print "d3:  " + d3

プリント:

d1:  {u'Aa': 1, u'cc': u'False', u'BB': u'blabla'}
d2:  "{\"Aa\": 1, \"BB\": \"blabla\", \"cc\": \"False\"}"
d3:  {"Aa": 1, "cc": "False", "BB": "blabla"}

3
え?json.dumps辞書を(JSONエンコードされた)文字列に変換します。それはOPがやりたかったことではありません。-1。
Mark Amery

10
しかし、json.loadsと一緒に使用すると、エンコードされた文字なしで辞書が出力されます。wihchは質問に対する回答です(これは上記のd3印刷です)。よく回答を読んでください!
マーキュリー

8

uこれらの文字列がUnicodeではなく、8ビットの文字列であることをプレフィックス手段。uプレフィックスを表示しない最良の方法は、Python 3に切り替えることです。デフォルトでは、文字列はユニコードです。これがオプションではない場合、strコンストラクタはUnicodeから8ビットに変換するunicodeため、結果を再帰的にループし、に変換しstrます。ただし、文字列をUnicodeのままにしておくことをお勧めします。


8

ここではUnicodeが適切なタイプです。JSONDecoderのドキュメントでは、変換テーブルについて説明し、json文字列オブジェクトがUnicodeオブジェクトにデコードされていることを示しています

https://docs.python.org/2/library/json.html#encoders-and-decoders

JSON                    Python
==================================
object                  dict
array                   list
string                  unicode
number (int)            int, long
number (real)           float
true                    True
false                   False
null                    None

「エンコーディングは、このインスタンス(デフォルトではUTF-8)によってデコードされたstrオブジェクトを解釈するために使用されるエンコーディングを決定します。」


7

オブジェクトに付加されているこれらの「u」文字は、オブジェクトが「Unicode」でエンコードされていることを示します。

オブジェクトからこれらの「u」文字を削除したい場合は、次のようにします。

import json, ast
jdata = ast.literal_eval(json.dumps(jdata)) # Removing uni-code chars

Pythonシェルからチェックアウトしましょう

>>> import json, ast
>>> jdata = [{u'i': u'imap.gmail.com', u'p': u'aaaa'}, {u'i': u'333imap.com', u'p': u'bbbb'}]
>>> jdata = ast.literal_eval(json.dumps(jdata))
>>> jdata
[{'i': 'imap.gmail.com', 'p': 'aaaa'}, {'i': '333imap.com', 'p': 'bbbb'}]

私はすべての初心者がこのスクリプトを試してみて、〜from〜u'JSON出力を変換するスクリプトを自分で作成することをお勧めします:) ... stdinをスクリプトに追加できるだけで、最後にjson形式を追加できる場合は、準備完了!
ジョーダンジー

4

loggingデバッグとトラブルシューティングの目的で、Python ライブラリを使用してログにJSONデータをキャプチャしようとしたときに、この問題が発生し続けました。取得uテキストをコピーしてコードのどこかに貼り付けたい場合文字をは本当に厄介です。

みんなが言うように、これはそれがUnicode表現であるためであり、それはあなたが使用したという事実から来る可能性があります json.loads()そもそも文字列からデータをロードするためにし。

uプレフィックスなしでログにJSON表現が必要な場合は、ログアウトするjson.dumps()前に使用するのがコツです。例えば:

import json
import logging

# Prepare the data
json_data = json.loads('{"key": "value"}')

# Log normally and get the Unicode indicator
logging.warning('data: {}'.format(json_data))
>>> WARNING:root:data: {u'key': u'value'}

# Dump to a string before logging and get clean output!
logging.warning('data: {}'.format(json.dumps(json_data)))
>>> WARNING:root:data: {'key': 'value'}

1
これは本当に最良の答えであるはずです。'u 'は多くのコンテキストで「取り除かれるだけ」ではありません。本当にありがとうございました!
ジェシカPennell

1

これを試して:

mail_accounts [0] .encode( "ascii")


説明のない答えはほとんど役に立たない。これが役立つ理由などの情報を追加してみてください。
Abhilash Chandran

個人的には、不要な情報が多すぎて気が散ることで、長い回答を見つけます。上記の回答はすでに値がユニコードであり、ASCIIに変換する必要があることを説明しているので、ここでは繰り返しません。値を取得するためのより簡単な方法を示すだけです。誰かがこの答えを使用して問題を抱えている場合は、質問してください。私はさらに説明させていただきます!ありがとう
2nd Sight Lab

これは実際には、(途方もなく非効率的でなければならない)json.loads、json.dumpsサイクルを経由せずに各文字列を「通常」に再コード化する方法を簡潔に示す唯一の回答です。
Ed Randall

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.