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)