从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 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)

以上是 从redis封装Unicode 的全部内容, 来源链接: utcz.com/qa/402476.html

回到顶部