sql >> Base de Datos >  >> NoSQL >> Redis

Encapsulando Unicode desde redis

No estoy seguro de que haya un problema.

Si elimina todos los .encode('utf8') llama a su código, produce un archivo correcto, es decir, el archivo es el mismo que el producido por su código actual.

>>> r_server = redis.Redis('localhost')
>>> r_server.keys()
[]
>>> r_server.sadd(u'Hauptstädte', u'東京', u'Godthåb',u'Москва')
3
>>> r_server.keys()
['Hauptst\xc3\xa4dte']
>>> r_server.smembers(u'Hauptstädte')
set(['Godth\xc3\xa5b', '\xd0\x9c\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0', '\xe6\x9d\xb1\xe4\xba\xac'])

Esto muestra que las claves y los valores están codificados en UTF8, por lo tanto, .encode('utf8') no es requerido. La codificación predeterminada para redis módulo es UTF8. Esto se puede cambiar pasando una codificación al crear el cliente, p. redis.Redis('localhost', encoding='iso-8859-1') , pero no hay razón para hacerlo.

Si habilita la decodificación de respuestas con decode_responses=True luego, las respuestas se convertirán a Unicode usando la codificación de la conexión del cliente. Esto solo significa que no necesita decodificar explícitamente los datos devueltos, redis lo hará por ti y te devolverá una cadena Unicode:

>>> r_server = redis.Redis('localhost', decode_responses=True)
>>> r_server.keys()
[u'Hauptst\xe4dte']
>>> r_server.smembers(u'Hauptstädte')
set([u'Godth\xe5b', u'\u041c\u043e\u0441\u043a\u0432\u0430', u'\u6771\u4eac'])

Entonces, en su segundo ejemplo donde escribe datos recuperados de redis en un archivo, si habilita la decodificación de respuesta, entonces necesita abrir el archivo de salida con la codificación deseada. Si esta es la codificación predeterminada, puede usar open() . De lo contrario, puede usar codecs.open() o codifique manualmente los datos antes de escribirlos en el archivo.

import codecs

cities_tag = u'Hauptstädte'
with codecs.open('capitals.txt', 'w', encoding='utf8') as f:
    while r_server.scard(cities_tag) != 0:
        city = r_server.srandmember(cities_tag)
        f.write(city + '\n')
        r_server.srem(cities_tag, city)