从redis封装Unicode

时间:2016-02-29 21:13:47

标签: python unicode redis

在第一个例子中,我们在文件中保存了两个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?

1 个答案:

答案 0 :(得分:0)

我不确定是否存在问题。

如果删除代码中的所有.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)