在第一个示例中,我们将两个Unicode字符串保存在一个文件中,同时委托编解码器对它们进行编码。
# -*- coding: utf-8 -*- import codecs cities = [u'Düsseldorf', u'天津市'] with codecs.open("cities", "w", "utf-8") as f: for c in cities: f.write(c)
现在,我们执行相同的操作,首先将两个名称保存为redis,然后将其读回,然后将已读取的内容保存到文件中。因为我们已经读过什么内容,所以utf-8我们跳过该部分的解码/编码。
utf-8
# -*- coding: utf-8 -*- import redis r_server = redis.Redis('localhost') #, decode_responses = True) cities_tag = u'Städte' cities = [u'Düsseldorf', u'天津市'] for city in cities: r_server.sadd(cities_tag.encode('utf8'), city.encode('utf8')) with open(u'someCities.txt', 'w') as f: while r_server.scard(cities_tag.encode('utf8')) != 0: city_utf8 = r_server.srandmember(cities_tag.encode('utf8')) f.write(city_utf8) r_server.srem(cities_tag.encode('utf8'), city_utf8)
我该如何更换线路
r_server = redis.Redis('localhost')
与
r_server = redis.Redis('localhost', decode_responses = True)
避免在使用Redis时大量引入.encode / .decode?
我不确定是否有问题。
如果删除.encode('utf8')代码中的所有调用,它将生成一个正确的文件,即该文件与您当前代码生成的文件相同。
.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'),但没有理由。
redis
redis.Redis('localhost', encoding='iso-8859-1')
如果启用带有的响应解码,decode_responses=True则将使用客户端连接的编码将响应转换为unicode。这只是意味着您不需要显式解码返回的数据,redis而是将为您完成此操作并返回一个unicode字符串:
decode_responses=True
>>> 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检索到的数据写入文件中,如果启用响应解码,则需要使用所需的编码打开输出文件。如果这是默认编码,则可以使用open()。否则,您可以codecs.open()在写入文件之前使用或手动编码数据。
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)