Ik weet niet zeker of er een probleem is.
Als u alle .encode('utf8')
. verwijdert uw code aanroept, produceert het een correct bestand, d.w.z. het bestand is hetzelfde als het bestand dat door uw huidige code wordt geproduceerd.
>>> 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'])
Dit toont aan dat sleutels en waarden UTF8-gecodeerd zijn, daarom .encode('utf8')
is niet nodig. De standaardcodering voor de redis
module is UTF8. Dit kan worden gewijzigd door een codering door te geven bij het maken van de client, b.v. redis.Redis('localhost', encoding='iso-8859-1')
, maar daar is geen reden voor.
Als u responsdecodering inschakelt met decode_responses=True
dan worden de antwoorden geconverteerd naar unicode met behulp van de codering van de clientverbinding. Dit betekent alleen dat u de geretourneerde gegevens niet expliciet hoeft te decoderen, redis
zal het voor je doen en je een unicode-string teruggeven:
>>> 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'])
Dus, in uw tweede voorbeeld, waar u gegevens die zijn opgehaald uit redis naar een bestand schrijft, moet u, als u responsdecodering inschakelt, het uitvoerbestand openen met de gewenste codering. Als dit de standaardcodering is, kunt u gewoon open()
. gebruiken . Anders kunt u codecs.open()
. gebruiken of codeer de gegevens handmatig voordat u naar het bestand schrijft.
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)