Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Encapsulando Unicode do redis


Não tenho certeza de que haja um problema.

Se você remover todos os arquivos .encode('utf8') chamadas em seu código ele produz um arquivo correto, ou seja, o arquivo é o mesmo que aquele produzido pelo seu código atual.
>>> 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'])

Isso mostra que as chaves e os valores são codificados em UTF8, portanto, .encode('utf8') não é necessário. A codificação padrão para o redis módulo é UTF8. Isso pode ser alterado passando uma codificação ao criar o cliente, por exemplo redis.Redis('localhost', encoding='iso-8859-1') , mas não há razão para isso.

Se você habilitar a decodificação de resposta com decode_responses=True em seguida, as respostas serão convertidas em unicode usando a codificação da conexão do cliente. Isso significa apenas que você não precisa decodificar explicitamente os dados retornados, redis fará isso por você e retornará uma string 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'])

Portanto, em seu segundo exemplo em que você grava dados recuperados do redis em um arquivo, se você habilitar a decodificação de resposta, precisará abrir o arquivo de saída com a codificação desejada. Se esta for a codificação padrão, você pode usar open() . Caso contrário, você pode usar codecs.open() ou codifique manualmente os dados antes de gravar no arquivo.
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)