小编典典

从redis封装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?


阅读 464

收藏
2020-06-20

共1个答案

小编典典

我不确定是否有问题。

如果删除.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)
2020-06-20