Saya tidak yakin ada masalah.
Jika Anda menghapus semua .encode('utf8')
panggilan dalam kode Anda itu menghasilkan file yang benar, yaitu file tersebut sama dengan yang dihasilkan oleh kode Anda saat ini.
>>> 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'])
Ini menunjukkan bahwa kunci dan nilai dikodekan UTF8, oleh karena itu .encode('utf8')
tidak diperlukan. Encoding default untuk redis
modul adalah UTF8. Ini dapat diubah dengan meneruskan penyandian saat membuat klien, mis. redis.Redis('localhost', encoding='iso-8859-1')
, tapi tidak ada alasan untuk itu.
Jika Anda mengaktifkan decoding respons dengan decode_responses=True
kemudian tanggapan akan dikonversi ke unicode menggunakan pengkodean koneksi klien. Ini hanya berarti bahwa Anda tidak perlu secara eksplisit mendekode data yang dikembalikan, redis
akan melakukannya untuk Anda dan mengembalikan string 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'])
Jadi, dalam contoh kedua Anda di mana Anda menulis data yang diambil dari redis ke file, jika Anda mengaktifkan decoding respons maka Anda perlu membuka file output dengan pengkodean yang diinginkan. Jika ini adalah penyandian default maka Anda bisa menggunakan open()
. Jika tidak, Anda dapat menggunakan codecs.open()
atau menyandikan data secara manual sebelum menulis ke 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)