Jeg er ikke sikker på, at der er et problem.
Hvis du fjerner alle .encode('utf8')
kalder din kode ind, producerer den en korrekt fil, dvs. filen er den samme som den, der er produceret af din nuværende kode.
>>> 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'])
Dette viser, at nøgler og værdier er UTF8-kodede, derfor .encode('utf8')
er ikke påkrævet. Standardkodningen for redis
modulet er UTF8. Dette kan ændres ved at sende en kodning ved oprettelse af klienten, f.eks. redis.Redis('localhost', encoding='iso-8859-1')
, men det er der ingen grund til.
Hvis du aktiverer svarafkodning med decode_responses=True
derefter vil svarene blive konverteret til unicode ved hjælp af klientforbindelsens kodning. Dette betyder blot, at du ikke eksplicit behøver at afkode de returnerede data, redis
vil gøre det for dig og give dig en unicode-streng tilbage:
>>> 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'])
Så i dit andet eksempel, hvor du skriver data hentet fra redis til en fil, hvis du aktiverer svarafkodning, skal du åbne outputfilen med den ønskede kodning. Hvis dette er standardkodningen, kan du bare bruge open()
. Ellers kan du bruge codecs.open()
eller indkode dataene manuelt, før du skriver til filen.
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)