Redis
 sql >> Base de données >  >> NoSQL >> Redis

Encapsuler Unicode à partir de redis

Je ne suis pas sûr qu'il y ait un problème.

Si vous supprimez tous les .encode('utf8') appelle dans votre code, il produit un fichier correct, c'est-à-dire que le fichier est le même que celui produit par votre code actuel.

>>> 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'])

Cela montre que les clés et les valeurs sont encodées en UTF8, donc .encode('utf8') n'est pas requis. L'encodage par défaut pour le redis module est UTF8. Cela peut être modifié en passant un encodage lors de la création du client, par ex. redis.Redis('localhost', encoding='iso-8859-1') , mais il n'y a aucune raison de le faire.

Si vous activez le décodage des réponses avec decode_responses=True puis les réponses seront converties en unicode en utilisant l'encodage de la connexion client. Cela signifie simplement que vous n'avez pas besoin de décoder explicitement les données renvoyées, redis le fera pour vous et vous rendra une chaîne 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'])

Ainsi, dans votre deuxième exemple où vous écrivez des données extraites de redis dans un fichier, si vous activez le décodage de réponse, vous devez ouvrir le fichier de sortie avec l'encodage souhaité. S'il s'agit de l'encodage par défaut, vous pouvez simplement utiliser open() . Sinon, vous pouvez utiliser codecs.open() ou encoder manuellement les données avant d'écrire dans le fichier.

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)