web-dev-qa-db-fra.com

Comment supprimer des caractères unicode des données du dictionnaire en python

Après avoir utilisé request library, je reçois un résultat inférieur à dict dans response.json ()

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

Je souhaite supprimer tous les caractères Unicode et n'imprimer que les paires valeur/clé sans les caractères Unicode 

J'ai essayé la méthode ci-dessous pour supprimer, mais elle montre une chaîne mal formée 

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

Obtenir 'ValueError: chaîne malformée'

Toute suggestion sur la façon de le faire?

5
Maverick

Vous pouvez utiliser unicodestring.encode("ascii","replace") 

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

Changez votre None en 'None':

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

c'est un problème de casting - ast like str's

Aussi, peut-être que vous voulez changer tout None pour vider str ou 'None' str ... Voir ce fil: Python: moyen le plus idiomatique de convertir None en chaîne vide? avec ce code, j'ai changé la chaîne vide en 'None':

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

Ce fragment de code vous aidera à conserver les données sans la notation de préfixe 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 () convertira le dict en type chaîne et eval () l'inversera.

Remarque: la valeur de la clé 1 est passée de Aucune à 'valeur1' à des fins de test

1
S.K. Venkat

Je ne comprends pas vraiment pourquoi tu veux ça. Votre variable est un dict Python normal avec des chaînes Unicode normales, et elles sont imprimées en tant que u'' pour les distinguer des chaînes d'octets, mais leur importation ne devrait pas avoir d'importance.

Si vous souhaitez les enregistrer sous forme de chaînes pour les lire ultérieurement sous forme de données, JSON est un format adapté à cette fin. Donc, nul besoin d'appeler la fonction .json() de la requête, utilisez simplement l'attribut .text de la réponse - c'est déjà JSON, après tout.

Votre essai

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

Échec parce que vous avez tout d'abord transformé c en JSON, puis que vous essayez de l'analyser en tant que littéral Python. Cela ne fonctionne pas car Python n'est pas JSON; en particulier, l'une a null et l'autre None.

Alors peut-être que vous voulez changer les chaînes Unicode en bytestrings? Comme en les encodant en UTF8, cela pourrait fonctionner:

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

Ou quelque chose comme ça, mais je ne sais pas pourquoi vous en auriez besoin.

0
RemcoGerlich