Tengo un diccionario y quiero convertir cada valor a utf-8. Esto funciona, pero hay un «más python el» camino?

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

Para una lista que yo podía hacer

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

pero no estoy seguro de cómo hacer el equivalente de la cosa para los diccionarios.

Esto es diferente de Python Diccionario De La Comprensión De La porque yo no estoy tratando de crear un diccionario a partir de cero, sino de un diccionario existente. Las soluciones a los vinculados pregunta no me muestran cómo el bucle a través de los pares clave/valor en el diccionario existente en orden a modificar en nueva k/v pares para el nuevo diccionario. La respuesta (ya aceptado) a continuación se muestra cómo hacerlo, y es mucho más clara para leer/entender para alguien que tiene una tarea similar a la mía que las respuestas a los enlaces relacionados con la cuestión, que es más complejo.

  • Estoy impresionado logrado con la frase correcta (diccionario de la comprensión), pero no de la búsqueda para «python diccionario de la comprensión»!
  • ¿por qué convertir sus claves para utf-8? esto suena como XY problema
  • Posibles duplicados de Python Diccionario de la Comprensión de la
  • El Peligro Robinson! unicode(row[key]) va a utilizar el juego de caracteres del sistema para decodificar row[key]. Esto implica que row[key] ya está codificado para un determinado conjunto de caracteres. Además, usted no debe codificar hasta que usted necesite de salida en algún lugar, en cuyo caso, permitir la impresión a convertir o escribir utilizando una codificación de texto de contenedor, como io.open()
  • He encontrado la lista de comprensión, y extrapolado al diccionario de la comprensión, pero no encontró un buen ejemplo cuando busqué en google para ello.
  • Me estoy convirtiendo no mis llaves pero mis valores a utf-8 porque cuando trato de escribir con un CSV DictWriter se rompe en las cadenas unicode que están fuera del rango ascii. Usando Python 2.7
  • Me gustaría recomendar el uso de github.com/jdunck/python-unicodecsv en lugar de tratar de escribir su propio codificador/decodificador
  • ¿por qué es el mejor? Tener que instalar paquetes adicionales hace que sea una molestia para compartir el código.

6 Comentarios

  1. 12

    Utilizar un diccionario de la comprensión de la. Parece que está empezando con un diccionario para:

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

    El ejemplo del diccionario de comprensión está cerca del final de la cuadra en el enlace.

    • Esto funciona para python 2. Respuesta para python 3 a continuación
  2. 2

    Como he tenido este problema así, he construido una función muy sencilla que permite a cualquier dict a ser decodificado en utf-8 (El problema con la actual respuesta es que sólo se aplica para el simple dict).

    Si puede ayudar a alguien, es genial, aquí es la función :

    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)
  3. 1

    Depende de por qué estás implícitamente la codificación a UTF-8. Si es porque va a escribir a un archivo, el python el camino es dejar a tus cadenas de caracteres de Unicode y codificar en la salida:

    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)
    • Yo soy, pero estoy escribiendo con un csv DictWriter, y no estoy seguro de cómo hacer la codificación en la salida en ese caso.
    • Python 2.x CSV módulo se rompe con Unicode, por lo que el otro contribuyente respuestas son el método más fácil. Si quieres hacerlo bien, como Python3 hace, fijos CSV módulo: github.com/jdunck/python-unicodecsv
    • Yo no puedo usar Python 3 por otras razones, pero gracias por mostrar la «forma correcta» de hacerlo si es posible.
  4. 1

    Python 3 versión edificio en que una respuesta por That1Guy.

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

    Sólo puede iterar a través de las teclas si quería:

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

    Mejor enfoque para convertir no-ascii diccionario de valor en ascii personajes es

    mydict = {k: unicode(v, errors='ignore').encode('ascii','ignore') for k,v in mydict.iteritems()} 

    Mejor enfoque para convertir no utf-8 diccionario de valor en utf-8 personajes es

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

    Para más referencia leer python unicode documentación

Dejar respuesta

Please enter your comment!
Please enter your name here