2011-01-13 14 views
6

अजगर में HTTP पर टैब-सीमांकित फ़ाइल आयात करने पर कार्य में अजगर से अज्ञात एन्कोडिंग के साथ फ़ाइल आयात कर रहा है।MongoDB

MongoDB में एक पंक्ति के डेटा डालने से पहले, मैं स्लैश को हटाने हूँ, टिक्स और स्ट्रिंग से बोलियां।

जो भी डेटा की एन्कोडिंग है, MongoDB मुझे अपवाद फेंक है:

bson.errors.InvalidStringData: strings in documents must be valid UTF-8 

तो के रूप में जल्दी के रूप में मैं कर सकते हैं एक प्रयास में इस समस्या को हल करने के लिए, पढ़ने मेरे द्वारा की गई मैं चाहता हूँ से , यूनिकोड() फ़ंक्शन का उपयोग करके पंक्ति के डेटा को यूनिकोड में रूपांतरित करें। इसके अलावा, मैं पहले पैरामीटर के रूप डिकोड() फ़ंक्शन गुजर "यूनिकोड" कॉल करने की कोशिश की है, लेकिन त्रुटि प्राप्त:,

LookupError: unknown encoding: unicode 

वहां से मैं ऐसे स्लैश की जगह के रूप में मेरे स्ट्रिंग जोड़तोड़ कर सकते हैं, टिक्स, और उद्धरण। फिर MongoDB में डेटा डालने से पहले, str.encode ('utf-8') फ़ंक्शन का उपयोग करके इसे यूटीएफ -8 में परिवर्तित करें।

समस्या: जब यूनिकोड में कनवर्ट करने, मैं त्रुटि

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

प्राप्त कर रहा इस त्रुटि के साथ, मैं वास्तव में यकीन है कि जारी रखने के लिए जहां नहीं हूँ। मैं कैसे सफलतापूर्वक अपने एन्कोडिंग जानने के बिना एक फ़ाइल से डेटा आयात करते हैं और सफलतापूर्वक MongoDB, जो UTF-8 की आवश्यकता है में डालें:

मेरा प्रश्न है?

धन्यवाद बहुत!

+0

क्यों इस टैग है "csv" पढ़ने पर विचार? –

+0

लेकिन आपने कहा "HTTP पर एक टैब-सीमांकित फ़ाइल आयात करना" ... "सीएसवी" उसमें फिट कहां है? –

उत्तर

7

क्रम में इन का प्रयास करें:

(0) जाँच करें कि स्लैश के अपने हटाने/ticks/आदि डेटा butchering नहीं है। एक टिक क्या है? कृपया अपना कोड दिखाएं। कृपया कच्चे डेटा का नमूना दिखाएं ... print repr(sample_raw data) का उपयोग करें और आउटपुट को अपने प्रश्न के संपादन में कॉपी/पेस्ट करें।

(1) एक पुराना अधिकतम है: "यदि फ़ाइल का एन्कोडिंग अज्ञात है, या आईएसओ -885 9 -1 होने के लिए कहा गया है, तो यह cp1252 है" ... आप इसे कहां से प्राप्त कर रहे हैं? यह पश्चिमी यूरोप, अमेरिका, या से आ रहा है, तो किसी भी अंग्रेजी/फ्रेंच/स्पेनिश बोलने वाले देश/क्षेत्र कहीं और है, और यह वैध UTF-8, तो यह होने की संभावना है cp1252

[संपादित करें 2] आपका त्रुटि नहीं है बाइट 0x93 सभी एन्कोडिंग cp1250 के लिए U + 201C बायां दोहरा उद्धरण चिह्न को डीकोड समावेशी cp1258 करने के लिए ... क्या भाषा पाठ में लिखा है? [/ संपादित करें 2]

(2) फ़ाइल को सहेजें (टिक हटाने से पहले), फिर फ़ाइल को अपने ब्राउज़र में खोलें: क्या यह समझदार दिखता है? जब आप व्यू/कैरेक्टर एन्कोडिंग पर क्लिक करते हैं तो आप क्या देखते हैं?

(3) कुछ और सलाह के साथ प्रयास करें chardet

संपादित:

(1) अपने इनपुट डेटा परिवर्तित:

एक बार जब आप जानते हैं कि एन्कोडिंग है (यह मान लें cp1252 है) यूनिकोड करने के लिए: uc = raw_data.decode('cp1252')

(2) प्रक्रिया डेटा (स्लैश हटाने/टिक्स/आदि) के रूप में यूनिकोड: clean_uc = manipulate(uc)

(3) आप अपने डेटा UTF8 के रूप में एन्कोड उत्पादन की जरूरत है: to_mongo = clean_uc.encode('utf8')

नोट 1: आपके त्रुटि संदेश कहते हैं, "स्थिति 1258 में बाइट 0x93 डिकोड नहीं कर सकते हैं" ... 1258 बाइट्स की एक नहीं बल्कि लंबे समय तक हिस्सा है पाठ; क्या यह उचित है? क्या आपने उस डेटा को देखा है जिसके बारे में शिकायत है? कैसे? तुमने क्या देखा?

नोट 2: कृपया the Python Unicode HOWTO और this article

+0

@ जोशुआ बर्न्स: उत्तर स्वीकार करने के लिए धन्यवाद, लेकिन भविष्य के पाठकों को मुझे आश्चर्य होगा कि परिणाम क्या था ... cp1252, या कुछ और? –

+0

@ जोशुआ बर्न्स: क्षमा करें, मुझे "वास्तव में" समझ में नहीं आता है। मैंने यह नहीं कहा कि यह लैटिन -1 था। मैंने कहा कि यह सीपी 125 एक्स होने की संभावना है। लैटिन -1 सीपी 125 एक्स नहीं है। आपकी त्रुटि बाइट 0x93 लैटिन -1 के रूप में डीकोड किए जाने पर कुछ अजीब कभी-कभी-वास्तविक-वास्तविक-दुनिया नियंत्रण नहीं है। –

+0

फ़ाइल मूल रूप से अंग्रेजी में लिखी गई थी, और बाहरी स्रोत द्वारा प्रदान की गई थी। मैं लाइन के नीचे कहीं अनुमान लगा रहा हूं कि कुछ डेटा दूषित हो गया है और कभी तय नहीं किया गया था। लैटिन -1 के रूप में पाठ को एन्कोड करने से इस परिदृश्य के लिए समस्या हल हो गई है, भले ही इसका मतलब है कि एक गैर यथार्थवादी चरित्र का प्रतिनिधित्व किया गया था। –