Tôi không chắc rằng có sự cố.
Nếu bạn xóa tất cả .encode('utf8')
lệnh gọi trong mã của bạn, nó tạo ra một tệp chính xác, tức là tệp giống với tệp được tạo bởi mã hiện tại của bạn.
>>> 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'])
Điều này cho thấy rằng các khóa và giá trị được mã hóa UTF8, do đó .encode('utf8')
không được yêu cầu. Mã hóa mặc định cho redis
mô-đun là UTF8. Điều này có thể được thay đổi bằng cách chuyển một mã hóa khi tạo ứng dụng khách, ví dụ:redis.Redis('localhost', encoding='iso-8859-1')
, nhưng không có lý do gì để.
Nếu bạn bật giải mã phản hồi với decode_responses=True
sau đó các phản hồi sẽ được chuyển đổi thành unicode bằng cách sử dụng mã hóa của kết nối máy khách. Điều này chỉ có nghĩa là bạn không cần phải giải mã dữ liệu trả về một cách rõ ràng, redis
sẽ làm điều đó cho bạn và trả lại cho bạn một chuỗi 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'])
Vì vậy, trong ví dụ thứ hai, nơi bạn ghi dữ liệu được truy xuất từ redis vào một tệp, nếu bạn bật giải mã phản hồi thì bạn cần mở tệp đầu ra với mã hóa mong muốn. Nếu đây là mã hóa mặc định thì bạn chỉ có thể sử dụng open()
. Nếu không, bạn có thể sử dụng codecs.open()
hoặc mã hóa dữ liệu theo cách thủ công trước khi ghi vào tệp.
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)