2010-05-14 10 views
13

का उपयोग नहीं करना चाहिए, मैं वर्तमान में अपने उद्देश्यों के लिए एक SQL डेटाबेस में फ़ाइल नाम जारी रख रहा हूं। जब भी मैं विशेष वर्ण (é आदि) है कि एक फ़ाइल सम्मिलित करने का प्रयास करें, यह निम्न त्रुटि फेंकता है:pysqlite2: प्रोग्रामिंग त्रुटि - आपको 8-बिट बाइटस्टिंग

pysqlite2.dbapi2.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings. 

जब मैं करने के लिए भेजा मूल्य लपेटकर द्वारा "मेरे आवेदन से अधिक यूनिकोड तार करने के लिए स्विच" है जैसे यूनिकोड विधि के साथ pysqlite:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 66: ordinal not in range(128) 

वहाँ कुछ मैं क्या कर सकते हैं इस से छुटकारा पाने के है: unicode(filename), यह इस त्रुटि फेंकता है? मेरी सभी फाइलों को अनुरूप बनाने के लिए संशोधित करना एक विकल्प नहीं है।

अद्यतन अगर मैं filename.decode("utf-8") के माध्यम से पाठ को डिकोड, मैं अभी भी ProgrammingError ऊपर हो रही है।

मेरे वास्तविक कोड इस तरह दिखता है:

cursor.execute("select * from musiclibrary where absolutepath = ?;", 
    [filename.decode("utf-8")]) 

क्या मेरी कोड यहाँ की तरह देखना चाहिए?

+0

प्रश्न को अपडेट करने के बाद, इस कोड को लगता है, वास्तव में त्रुटि उत्पन्न करने वाला कोड नहीं था, है ना? – metamatt

+0

ठीक है, यह बाद में आवेदन में समान कोड था। –

उत्तर

14

आपको यूनिकोड में रूपांतरण के लिए filename के एन्कोडिंग को निर्दिष्ट करने की आवश्यकता है, उदाहरण के लिए: filename.decode('utf-8')। बस unicode(...) का उपयोग कंसोल एन्कोडिंग चुनता है, जो अक्सर अविश्वसनीय होता है (और अक्सर ascii)।

# coding: utf-8 
+0

मैंने ऐसा करने की कोशिश की, लेकिन ऐसा लगता है कि मुझे अभी भी ऊपर उल्लिखित त्रुटियां मिल रही हैं। मैंने पोस्ट को अपडेट किया है जो मैं अब कर रहा हूं, ताकि आप देख सकें कि मैं क्या कर रहा हूं। धन्यवाद! –

+0

मेरा बुरा, मेरे स्क्रिप्ट में बाद में कुछ और खराब रूपांतरण हो रहा था जो एक ही त्रुटि फेंक रहा था :) –

1

आप सीधे यूनिकोड स्ट्रिंग पारित करने के लिए करने की कोशिश की है आपके एसक्यूएल कथन का।

अब, यह पर निर्भर करता है कि आप फ़ाइल नाम सूची प्राप्त करते हैं। शायद आप os.listdir या os.walk का उपयोग कर फाइल सिस्टम पढ़ रहे हैं?
उदाहरण::

  • os.listdir(u'.')
  • os.walk(u'.')

अगर ऐसा है, वहाँ यूनिकोड के रूप में सीधे फ़ाइल नाम के लिए एक तरह से सिर्फ इन कार्यों में से किसी के लिए एक यूनिकोड तर्क पारित करके है बेशक, आप वास्तविक निर्देशिका के साथ u'.' निर्देशिका को प्रतिस्थापित कर सकते हैं, जिनकी सामग्री आप पढ़ रहे हैं। बस सुनिश्चित करें कि यह एक यूनिकोड स्ट्रिंग है।

+0

यदि मैं कोशिश करता हूं, तो ऐसा लगता है। मैं लगभग 3000 फाइलों में पुनरावृत्ति कर रहा हूं, और यह फ़ाइल नाम पर विफल रहता है: 02 - पड़ोस # 2 (लाइका)। Mp3। क्या कोई रूपांतरण तकनीक है जिसे मैं कहीं याद कर रहा हूं? –

3

आप यूनिकोड के रूप में तर्क पारित करना चाहिए:

cursor.execute("select * from musiclibrary where absolutepath = ?;",(u'namé',)) 

आप स्क्रिप्ट की शुरुआत में फ़ाइल इनकोडिंग जोड़ने की आवश्यकता होगी:

1

आप पहले से ही बाहर इस लगा, लेकिन:

मुझे नहीं लगता कि आप वास्तव में मिल सकता है कि cursor.execute से ProgrammingError अपवाद ("musiclibrary से * का चयन करें जहां absolutepath =?," है, [filename.decode ("utf-8")]), जैसा कि वर्तमान में सवाल है।

या तो utf-8 डीकोड विस्फोट हो जाएगा, या कर्सर.एक्सक्यूट कॉल परिणाम से खुश होगा।

-1

इस को बदलने के लिए प्रयास करें:

cursor.execute("select * from musiclibrary where absolutepath = ?;", 
    [unicode(filename,'utf8')]) 

अपने फ़ाइलनाम मूल में, utf8 साथ सांकेतिक शब्दों में बदलना नहीं अपने एन्कोडिंग को utf8 बदल जाते हैं।