Non sono sicuro che ci sia un problema.
Se rimuovi tutti i .encode('utf8')
chiama nel tuo codice produce un file corretto, cioè il file è lo stesso di quello prodotto dal tuo codice corrente.
>>> 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'])
Questo mostra che chiavi e valori sono codificati UTF8, quindi .encode('utf8')
non è richiesto. La codifica predefinita per redis
il modulo è UTF8. Questo può essere modificato passando una codifica durante la creazione del client, ad es. redis.Redis('localhost', encoding='iso-8859-1')
, ma non c'è motivo per farlo.
Se abiliti la decodifica della risposta con decode_responses=True
quindi le risposte verranno convertite in unicode utilizzando la codifica della connessione client. Ciò significa semplicemente che non è necessario decodificare in modo esplicito i dati restituiti, redis
lo farà per te e ti restituirà una stringa 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'])
Quindi, nel tuo secondo esempio in cui scrivi i dati recuperati da redis in un file, se abiliti la decodifica della risposta, devi aprire il file di output con la codifica desiderata. Se questa è la codifica predefinita, puoi semplicemente usare open()
. Altrimenti puoi usare codecs.open()
o codificare manualmente i dati prima di scrivere nel file.
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)