Redis
 sql >> Database >  >> NoSQL >> Redis

Incapsulamento di Unicode da redis

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)