問題があるかどうかわかりません。
すべての.encode('utf8')
を削除した場合 コードを呼び出すと、正しいファイルが生成されます。つまり、ファイルは現在のコードで生成されたものと同じです。
>>> 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'])
これは、キーと値がUTF8でエンコードされていることを示しているため、.encode('utf8')
必須ではありません。 redis
のデフォルトのエンコーディング モジュールはUTF8です。これは、クライアントの作成時にエンコーディングを渡すことで変更できます。 redis.Redis('localhost', encoding='iso-8859-1')
、しかし理由はありません。
decode_responses=True
を使用して応答のデコードを有効にした場合 次に、応答はクライアント接続のエンコーディングを使用してユニコードに変換されます。これは、返されたデータを明示的にデコードする必要がないことを意味します。redis
それを行い、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'])
したがって、redisから取得したデータをファイルに書き込む2番目の例では、応答のデコードを有効にする場合は、目的のエンコードで出力ファイルを開く必要があります。これがデフォルトのエンコーディングである場合は、open()
を使用できます。 。それ以外の場合は、codecs.open()
を使用できます または、ファイルに書き込む前にデータを手動でエンコードします。
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)