从redis封装Unicode
在第一个示例中,我们将两个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
我们跳过该部分的解码/编码。
# -*- 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')
代码中的所有调用,它将生成一个正确的文件,即该文件与您当前代码生成的文件相同。
>>> 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
则将使用客户端连接的编码将响应转换为unicode。这只是意味着您不需要显式解码返回的数据,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检索到的数据写入文件中,如果启用响应解码,则需要使用所需的编码打开输出文件。如果这是默认编码,则可以使用open()
。否则,您可以codecs.open()
在写入文件之前使用或手动编码数据。
import codecscities_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)
以上是 从redis封装Unicode 的全部内容, 来源链接: utcz.com/qa/402476.html