मुझे यकीन नहीं है कि कोई समस्या है।
यदि आप सभी .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
. के साथ प्रतिक्रिया डिकोडिंग सक्षम करते हैं फिर क्लाइंट कनेक्शन के एन्कोडिंग का उपयोग करके प्रतिक्रियाओं को यूनिकोड में परिवर्तित कर दिया जाएगा। इसका सीधा सा मतलब है कि आपको लौटाए गए डेटा को स्पष्ट रूप से डीकोड करने की आवश्यकता नहीं है, redis
यह आपके लिए करेगा और आपको एक यूनिकोड स्ट्रिंग वापस देगा:
>>> 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'])
तो, आपके दूसरे उदाहरण में जहां आप रेडिस से फ़ाइल में पुनर्प्राप्त डेटा लिखते हैं, यदि आप प्रतिक्रिया डिकोडिंग सक्षम करते हैं तो आपको वांछित एन्कोडिंग के साथ आउटपुट फ़ाइल खोलने की आवश्यकता होती है। यदि यह डिफ़ॉल्ट एन्कोडिंग है तो आप केवल 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)