में यूनिकोड कारखाना मुझे लगता है कि मैं एक SQL सर्वर डेटाबेस से पुन: प्राप्त करने हूँ एक अजगर 2.6 स्क्रिप्ट कि विशेष वर्ण, लैटिन -1 में एन्कोड पर gagging है,। मैं इन पात्रों को प्रिंट करना चाहता हूं, लेकिन मैं कुछ हद तक सीमित हूं क्योंकि मैं एक पुस्तकालय का उपयोग कर रहा हूं जो unicode
फैक्ट्री को कॉल करता है, और मुझे नहीं पता कि पाइथन ascii
के अलावा कोडेक का उपयोग कैसे करें।लैटिन -1 और अजगर
स्क्रिप्ट किसी SQL संपादक में सीधे एसक्यूएल निष्पादित करने के लिए बिना एक डेटाबेस से देखने डेटा लौटाने के लिए एक सरल उपकरण है। मैं परिणामों को प्रदर्शित करने के लिए PrettyTable 0.5 लाइब्रेरी का उपयोग करता हूं।
स्क्रिप्ट का मूल कोड का यह छोटा सा है। कर्सर से प्राप्त टुपल्स में पूर्णांक और स्ट्रिंग डेटा होता है, और कोई यूनिकोड डेटा नहीं होता है। (मैं pyodbc
के बजाय adodbapi
का उपयोग करेंगे, जो मुझे यूनिकोड मिलेगा, लेकिन adodbapi
मुझे अन्य समस्याओं देता है।)
x = pyodbc.connect(cxnstring)
r = x.cursor()
r.execute(sql)
t = PrettyTable(columns)
for rec in r:
t.add_row(rec)
r.close()
x.close()
t.set_field_align("ID", 'r')
t.set_field_align("Name", 'l')
print t
लेकिन Name
स्तंभ अक्षर है कि ASCII सीमा के बाहर गिर हो सकते हैं। मैं कभी कभी, इस तरह एक त्रुटि संदेश मिल जाएगा, prettytable.pyc
के 222 लाइन में जब यह t.add_row
कॉल करने के लिए हो जाता है:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xed in position 12: ordinal not in range(128)
यह prettytable.py
में 222 लाइन है। यह unicode
का उपयोग करता है, जो कि मेरी समस्याओं का स्रोत है, न केवल इस स्क्रिप्ट में, बल्कि अन्य पायथन स्क्रिप्ट्स में जो मैंने लिखा है।
for i in range(0,len(row)):
if len(unicode(row[i])) > self.widths[i]: # This is line 222
self.widths[i] = len(unicode(row[i]))
कृपया मुझे बताएं कि मैं यहां क्या कर रहा हूं। मैं unicode
कैसे हैकिंग prettytable.py
या किसी भी अन्य पुस्तकालयों का उपयोग किए बिना काम कर सकता हूं? क्या ऐसा करने का कोई तरीका है?
संपादित करें: त्रुटि print
कथन पर नहीं है, लेकिन t.add_row
पर कॉल करें।
संपादित करें: Bastien Léonard की मदद से, मैं निम्नलिखित समाधान के साथ आया था। यह एक पैनसिया नहीं है, लेकिन यह काम करता है।
x = pyodbc.connect(cxnstring)
r = x.cursor()
r.execute(sql)
t = PrettyTable(columns)
for rec in r:
urec = [s.decode('latin-1') if isinstance(s, str) else s for s in rec]
t.add_row(urec)
r.close()
x.close()
t.set_field_align("ID", 'r')
t.set_field_align("Name", 'l')
print t.get_string().encode('latin-1')
मैं रास्ते में डीकोड करने और रास्ते पर एन्कोड करने के लिए समाप्त हो गया। यह सब मुझे आशा करता है कि हर कोई अपने पुस्तकालयों को बाद में पाइथन 3.x में बंद कर देता है!
मैंने अपनी स्क्रिप्ट के शीर्ष पर कोडिंग डालने का प्रयास किया है, लेकिन यह अभी भी काम नहीं करता है। मैं स्पष्ट डिकोडिंग का प्रयास करूंगा, लेकिन मुझे आशा है कि एक और सामान्य समाधान होगा। – eksortso
शायद आप कोडिंग सेट नहीं करना चाहते हैं: latin1। इससे स्क्रिप्ट के स्रोत के एन्कोडिंग में परिवर्तन होता है, न कि इसका डेटा। –
@Glenn: मैंने सुझाव दिया कि क्योंकि मैंने सोचा था कि 'प्रिंट टी' लैटिन 1 कच्चे तारों को प्रिंट कर सकता है। –