web-dev-qa-db-fra.com

Convertir chaque valeur du dictionnaire en utf-8 (compréhension du dictionnaire?)

J'ai un dictionnaire et je veux convertir chaque valeur en utf-8. Cela fonctionne, mais existe-t-il une méthode "plus Pythonique"?

            for key in row.keys():
                row[key] = unicode(row[key]).encode("utf-8")

Pour une liste que je pourrais faire

[unicode(s).encode("utf-8") for s in row]

mais je ne sais pas comment faire la chose équivalente pour les dictionnaires.

Ceci est différent de Python Dictionary Comprehension parce que je n'essaie pas de créer un dictionnaire à partir de zéro, mais à partir d'un dictionnaire existant. Les solutions à la question liée ne me montrent pas comment parcourir les paires clé/valeur dans le dictionnaire existant afin de les modifier en nouvelles paires k/v pour le nouveau dictionnaire. La réponse (déjà acceptée) ci-dessous montre comment faire cela et est beaucoup plus claire à lire/comprendre pour quelqu'un qui a une tâche similaire à la mienne que les réponses à la question connexe liée, qui est plus complexe.

9
PurpleVermont

Utilisez un compréhension du dictionnaire . Il semble que vous commenciez par un dictionnaire:

 mydict = {k: unicode(v).encode("utf-8") for k,v in mydict.iteritems()}

L'exemple de compréhension de dictionnaire se situe vers la fin du bloc du lien.

12
That1Guy

Comme j'avais aussi ce problème, j'ai construit une fonction très simple qui permet de décoder n'importe quel dict dans utf-8 (Le problème avec la réponse actuelle est qu'elle s'applique uniquement au dict simple).

Si cela peut aider quelqu'un, c'est génial, voici la fonction:

def utfy_dict(dic):
    if isinstance(dic,unicode):
        return(dic.encode("utf-8"))
    Elif isinstance(dic,dict):
        for key in dic:
            dic[key] = utfy_dict(dic[key])
        return(dic)
    Elif isinstance(dic,list):
        new_l = []
        for e in dic:
            new_l.append(utfy_dict(e))
        return(new_l)
    else:
        return(dic)
2
Henri Chabert

Cela dépend de la raison pour laquelle vous codez implicitement en UTF-8. Si c'est parce que vous écrivez dans un fichier, la méthode Pythonic consiste à laisser vos chaînes en Unicode et à encoder en sortie:

with io.open("myfile.txt", "w", encoding="UTF-8") as my_file:
    for (key, values) in row.items():
        my_string = u"{key}: {value}".format(key=key, value=value)
        my_file.write(my_string)
1
Alastair McCormack

La version Python 3 s'appuyant sur cette seule réponse de That1Guy.

{k: str(v).encode("utf-8") for k,v in mydict.items()}
1
kjmerf

Vous pouvez simplement parcourir les touches si vous souhaitez:

{x:unicode(a[x]).encode("utf-8") for x in a.keys()}
0
ergonaut