web-dev-qa-db-ja.com

pythonの辞書データからUnicode文字を削除する方法

リクエストライブラリを使用した後、response.json()でdict以下になりました

{u'xyz': {u'key1': None, u'key2': u'Value2'}}

すべてのUnicode文字を削除し、Unicode文字なしでキーと値のペアのみを印刷したい

以下の方法で削除しようとしましたが、不正な文字列が表示されます

>>> import json, ast
>>> c = {u'xyz': {u'key1': None,u'key2': u'Value2'}}
>>> ast.literal_eval(json.dumps(c))

「ValueError:不正な形式の文字列」を取得する

それを行う方法に関する提案はありますか?

8
Maverick

なしを「なし」に変更します。

 c = {u'xyz': {u'key1': 'None', u'key2': u'Value2'}}

それはキャストの問題です-astはstrが好きです

また、おそらくすべてのNoneを空のstrまたは「None」strに変更したいかもしれません...このスレッドを参照してください: Python:Noneを空の文字列に変換する最も慣用的な方法? このコードで、私は空の文字列を「なし」に変更します。

def xstr(s):
    if s is None:
        return 'None'
    return str(s)
4
Ohad the Lad

このスニペットは、Unicodeプレフィックス表記uなしでデータを保持するのに役立ちます。

>>> import json
>>> c = {u'xyz': {u'key1': u'Value1',u'key2': u'Value2'}}
>>> print c
{u'xyz': {u'key2': u'Value2', u'key1': u'Value1'}}
>>> d = eval(json.dumps(c))
>>> print d
{'xyz': {'key2': 'Value2', 'key1': 'Value1'}}

json.dumps() はdictを文字列型に変換し、 eval() はそれを逆にします。

注:テストのために、key1の値がNoneから 'value1'に変更されました

2
S.K. Venkat

unicodestring.encode("ascii","replace")を使用できます

>>> ustr=u'Apple'
>>> ustr
u'Apple'
>>> astr=ustr.encode("ascii","replace")
>>> astr
'Apple'
1
Marichyasana

なぜこれが必要なのかよくわかりません。あなたの変数は通常のPython dictで通常のUnicode文字列を持ち、バイト文字列と区別するために偶然_u''_として出力されますが、それを使用することは重要ではありません。

それらを文字列として保存して後でデータとして読み取る場合、JSONはそのための適切な形式です。したがって、リクエストの.json()関数を呼び出す必要はまったくありません。応答の_.text_属性を使用するだけです。結局のところ、これはすでにJSONです。

あなたの試み

_>>> ast.literal_eval(json.dumps(c))
_

最初にcを再びJSONに変換し、次にPythonリテラルとして解析しようとするため失敗します。Pythonであるため機能しません=はJSONではなく、特に1つはnullを持ち、もう1つはNoneを持っています。

では、Unicode文字列をバイト文字列に変更したいですか?それらをUTF8としてエンコードすることと同様に、それはうまくいくかもしれません:

_def to_utf8(d):
    if type(d) is dict:
        result = {}
        for key, value in d.items():
            result[to_utf8(key)] = to_utf8(value)
    Elif type(d) is unicode:
        return d.encode('utf8')
    else:
        return d
_

またはそのようなものですが、なぜそれが必要になるのかはわかりません。

0
RemcoGerlich