Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Einkapseln von Unicode aus redis

Ich bin mir nicht sicher, ob ein Problem vorliegt.

Wenn Sie alle .encode('utf8') entfernen Aufrufe in Ihrem Code erzeugt es eine korrekte Datei, d.h. die Datei ist die gleiche wie die, die von Ihrem aktuellen Code erzeugt wird.

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

Dies zeigt, dass Schlüssel und Werte UTF8-kodiert sind, also .encode('utf8') ist nicht nötig. Die Standardcodierung für redis Modul ist UTF8. Dies kann geändert werden, indem beim Erstellen des Clients eine Codierung übergeben wird, z. redis.Redis('localhost', encoding='iso-8859-1') , aber es gibt keinen Grund dazu.

Wenn Sie die Antwortdecodierung mit decode_responses=True aktivieren dann werden die Antworten unter Verwendung der Codierung der Client-Verbindung in Unicode konvertiert. Das bedeutet nur, dass Sie die zurückgegebenen Daten nicht explizit dekodieren müssen, redis wird es für Sie tun und Ihnen einen Unicode-String zurückgeben:

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

Wenn Sie also in Ihrem zweiten Beispiel, in dem Sie von Redis abgerufene Daten in eine Datei schreiben, die Antwortdecodierung aktivieren, müssen Sie die Ausgabedatei mit der gewünschten Codierung öffnen. Wenn dies die Standardcodierung ist, können Sie einfach open() verwenden . Andernfalls können Sie codecs.open() verwenden oder codieren Sie die Daten manuell, bevor Sie sie in die Datei schreiben.

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)