पढ़ते समय UnicodeDecodeError
pd.read_csv UTF-8 मानकर चलता है। फ़ाइल किसी और एन्कोडिंग में सेव हो तो pandas UnicodeDecodeError: 'utf-8' codec can't decode byte देकर रुकता है। पुरानी हिंदी फ़ाइलें अक्सर Windows-1252 (ANSI) में होती हैं, या Kruti Dev जैसे फ़ॉन्ट के अंग्रेज़ी अक्षरों में। तब एन्कोडिंग साफ़ बताएँ:
pd.read_csv('data.csv', encoding='cp1252')Excel और Windows की पुरानी फ़ाइलों के लिए।encoding='latin-1'कभी फेल नहीं होता, पर€और टाइपोग्राफ़िक कोट गलत पढ़ता है – आमतौर परcp1252बेहतर है।- एन्कोडिंग पता न हो तो फ़ाइल Mojibuster में डालें: वह पहचानकर फ़ाइल UTF-8 में सेव कर देता है।
DataFrame में हिंदी की जगह ह
अगर DataFrame में हिंदी दिखता है, तो UTF-8 फ़ाइल latin-1 या cp1252 से पढ़ी गई – या डेटा पहले से टूटा था। पहले मामले में encoding='utf-8' काफ़ी है। डेटा खुद टूटा हो तो अकेले मान के लिए value.encode('cp1252').decode('utf-8') काम करता है, पर Windows-1252 में अपरिभाषित बाइट खो जाने पर यह फेल हो जाता है, और मिले-जुले डेटा में भी। आसान तरीका: पहले फ़ाइल Mojibuster से ठीक करें, फिर पढ़ें।
पहले
uke 'kgj fcØh jke 'kekZ fnYyh lhrk nsoh t;iqj
बाद में
नाम शहर बिक्री राम शर्मा दिल्ली सीता देवी जयपुर
to_csv: Excel में फ़ाइल गलत दिखती है
df.to_csv('export.csv') बिना BOM का UTF-8 लिखता है। Excel ऐसी फ़ाइल ANSI मानकर खोलता है और हिंदी हिंदी बन जाती है। encoding='utf-8-sig' से pandas BOM लिखता है और Excel UTF-8 पहचान लेता है। विस्तार से: Excel और CSV में हिंदी फ़ॉन्ट की समस्या।
Windows पर open()
open('file.txt') बिना encoding के Windows पर सिस्टम एन्कोडिंग इस्तेमाल करता है, आमतौर पर cp1252। Linux पर चलने वाली स्क्रिप्ट Windows पर वही UTF-8 हिंदी फ़ाइल ह के रूप में पढ़ती है या त्रुटि देती है। इसलिए हमेशा encoding='utf-8' दें या पर्यावरण चर PYTHONUTF8=1 सेट करें। PEP 686 से आगे के Python में UTF-8 वैसे भी डिफ़ॉल्ट होगा।
requests से वेब डेटा
requests response.text को Content-Type हेडर से तय करता है। अगर टेक्स्ट जवाब में character set न लिखा हो, तो वह ISO-8859-1 मान लेता है और हिंदी UTF-8 पेज हिंदी दिखाते हैं। पहले response.encoding = 'utf-8' सेट करें, या response.json() इस्तेमाल करें जो UTF-8 खुद पहचानता है।
अगर टेक्स्ट errors='replace' के साथ ऐसी एन्कोडिंग में लिखा गया जिसमें देवनागरी नहीं है, तो फ़ाइल में ? है – तब जानकारी खो चुकी है, देखें मोजिबाके क्या है।
अक्सर पूछे जाने वाले सवाल
क्या इसके लिए Python लाइब्रेरी है?
हाँ, ftfy Python कोड में mojibake ठीक करती है। प्रोग्रामिंग के बिना अकेली फ़ाइल के लिए Mojibuster तेज़ है और सेव करने से पहले हर बदलाव दिखाता है।
मुझे सबसे ज़्यादा कौन-से encoding मान चाहिए?
utf-8, utf-8-sig (BOM वाला UTF-8), cp1252 (Windows, पश्चिमी यूरोप), latin-1 और utf-16। बड़े-छोटे अक्षर और हाइफ़न से फ़र्क नहीं पड़ता।
क्या डिलिमिटर और संख्याएँ बनी रहती हैं?
हाँ। Mojibuster सिर्फ़ टूटे अक्षर बदलता है। कॉमा, कोट और नई पंक्तियाँ जैसी थीं वैसी रहती हैं।