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