SyntaxError: गैर-ASCII वर्ण '\ xa3' फ़ाइल में जब फ़ंक्शन '£' देता है


284

कहो मेरे पास एक समारोह है:

def NewFunction():
    return '£'

मैं इसके सामने एक पाउंड साइन के साथ कुछ सामान प्रिंट करना चाहता हूं और जब मैं इस प्रोग्राम को चलाने की कोशिश करता हूं तो यह एक त्रुटि प्रिंट करता है, यह त्रुटि संदेश प्रदर्शित होता है:

SyntaxError: Non-ASCII character '\xa3' in file 'blah' but no encoding declared;
see http://www.python.org/peps/pep-0263.html for details

क्या कोई मुझे सूचित कर सकता है कि मैं अपने रिटर्न फ़ंक्शन में पाउंड साइन कैसे शामिल कर सकता हूं? मैं मूल रूप से इसे एक कक्षा में उपयोग कर रहा हूं और यह उस '__str__'हिस्से के भीतर है जिसमें पाउंड साइन शामिल है।


43
क्या आपने उस PEP को भी पढ़ा है जिससे आप जुड़े थे? यह बताता है कि समस्या क्या है और इसे कैसे ठीक किया जाए।
murgatroid99

2
"क्या कोई मुझे सूचित कर सकता है कि मैं अपने रिटर्न फ़ंक्शन में पाउंड साइन कैसे शामिल कर सकता हूं।" खैर, त्रुटि संदेश कहता है " विवरण के लिए python.org/peps/pep-0263.html देखें"; शायद आपको वहाँ शुरू करना चाहिए?
कार्ल स्नेचेल

5
@ murgatroid99 यहां आप और मैं जिस समय यह टाइप करते हैं, 27 अन्य गायब हैं: हां, निश्चित रूप से मैं पीईपी पढ़ूंगा। कठिनाई स्तर: मुझे यह डॉकटर कंटेनर के खिलाफ / बिन / श को चलाने की कोशिश कर रहा है। मैं अजगर को चलाने की कोशिश नहीं कर रहा हूं। तो सभी PEP मुझे बताने जा रहे हैं कि अजगर कोड को कैसे ठीक किया जाए, मैं चलाने की कोशिश नहीं कर रहा हूं और लिख नहीं रहा हूं। मैं StackOverflow से अधिक संदर्भ की उम्मीद कर रहा था, इसके बजाय तस्करी मिली। :( आगे की खोज ने वास्तविक उत्तर को बदल दिया: stackoverflow.com/questions/38992850/… - ध्यान दें कि पीईपी ने मदद करने के लिए बिल्कुल शून्य कैसे किया।
मार्क एलन

@MarkAllen - आपके लिंक किए गए उत्तर में, त्रुटि संदेश इंगित करता है कि अजगर "/ बिन / बैश" की व्याख्या करने की कोशिश कर रहा है - यह स्वीकार करना आसान है कि कुछ अनदेखी करना आसान है, लेकिन इस प्रश्न में कुछ भी इंगित नहीं करता है कि यह डॉकटर या कंटेनर के साथ करना है, इसलिए सलाह जैसा कि आपने पाया है कि यह आपकी समस्या पर लागू नहीं होता है - यह स्मॉगनेस नहीं है, यह सिर्फ आपकी समस्या का संदर्भ है, यह यहां मौजूद नहीं है।
तनंतीश

@tanantish मैंने जो कहा, मैं उसके साथ खड़ा हूं। मुझे प्रश्न में त्रुटि मिली। उपयोगी जानकारी देने के बजाए लोगों से इस बारे में मुलाकात की गई, "क्या आपने इससे जुड़े पीईपी को भी पढ़ा है?" और, "अच्छी तरह से त्रुटि संदेश कहता है कि देखें (ब्लाह), प्रैप्स आपको शुरू करना चाहिए?" <- वे प्रतिक्रियाएँ सहायक नहीं हैं। मुझे यकीन नहीं है कि हम यह चर्चा क्यों कर रहे हैं।
मार्क

जवाबों:


368

मुझे लगता है कि PEP त्रुटि आपको देता है पढ़ने की सलाह देते हैं। समस्या यह है कि आपका कोड ASCII एन्कोडिंग का उपयोग करने की कोशिश कर रहा है, लेकिन पाउंड प्रतीक ASCII वर्ण नहीं है। UTF-8 एन्कोडिंग का उपयोग करने का प्रयास करें। आप # -*- coding: utf-8 -*-अपनी .py फ़ाइल के शीर्ष पर रखकर प्रारंभ कर सकते हैं । अधिक उन्नत पाने के लिए, आप अपने कोड में स्ट्रिंग आधार पर एक स्ट्रिंग पर एन्कोडिंग को भी परिभाषित कर सकते हैं। हालाँकि, यदि आप अपने कोड में पाउंड साइन शाब्दिक डालने की कोशिश कर रहे हैं, तो आपको एक एन्कोडिंग की आवश्यकता होगी जो इसे पूरी फ़ाइल के लिए समर्थन करती है।


306

निम्नलिखित दो लाइन जोड़ने से मेरे लिए .py स्क्रिप्ट का शीर्ष बैठ गया (मेरे लिए पहली पंक्ति आवश्यक थी):

#!/usr/bin/env python
# -*- coding: utf-8 -*- 

मुझे वही समस्या हुई और मेरा पायथन 2.7.11 है। दूसरी पंक्ति # -*- coding: utf-8 -*-को फ़ाइल के शीर्ष पर जोड़ने के बाद , इसने समस्या को हल कर दिया।
हैलॉन्ग

2
पहली पंक्ति यह है कि py फ़ाइल को * nix पर निष्पादन योग्य बनाया जाए। यह वास्तव में इस सवाल से संबंधित नहीं है।
cmd

57

पहले # -*- coding: utf-8 -*-फ़ाइल की शुरुआत में लाइन जोड़ें और फिर u'foo'अपने सभी गैर-एएससीआईआई यूनिकोड डेटा के लिए उपयोग करें:

def NewFunction():
    return u'£'

या इसे स्वचालित बनाने के लिए पाइथन 2.6 के बाद से उपलब्ध जादू का उपयोग करें:

from __future__ import unicode_literals

12
यदि आपके पास # -*- coding: utf-8 -*-आपके यूनिकोड स्ट्रिंग्स के साथ प्रीफ़िक्स करने की आवश्यकता नहीं हैu
डैनियल ली

@ अगर यह एक चर पर है तो क्या होगा? एक फ़ाइल पढ़ने के द्वारा उदाहरण? मैं उपयोग नहीं कर सकता, मैं इसे कैसे करूं?
स्कीज़ो-ओज़स

1
@DanielLee को छोड़कर यह सच नहीं है। # -*- coding: utf-8 -*-इसके बाद print 'błąd'कचरा उत्पादन होगा, जबकि print u'błąd'काम करता है।
प्रेज़ेमेक डी

@DanielLee प्रेजेमेक डी ने क्या कहा। UTF-8 शाब्दिक को अपने स्रोत कोड में डालना जैसे कि आम तौर पर एक अच्छा विचार नहीं है, और अवांछित व्यवहार को जन्म दे सकता है, विशेष रूप से पायथन 2 में। यदि शाब्दिक शुद्ध 7 बिट ASCII नहीं हैं, तो उन्हें वास्तविक यूनिकोड होना चाहिए, न कि UTF-8 इसलिए पायथन 2 में आपको uइस तरह के शाब्दिक रूप में उपसर्ग लगाना चाहिए । पाइथन 3 में, सादे तार वैसे भी यूनिकोड हैं, लेकिन uपाइथन 3 के हाल के संस्करणों में उपसर्ग की अनुमति है, जिससे कोड लिखना थोड़ा आसान हो जाता है, जो पाइथन 2 और 3 में सही ढंग से व्यवहार करता है
PM 2Ring

12

त्रुटि संदेश आपको बताता है कि वास्तव में क्या गलत है। गैर-ASCII वर्ण के एन्कोडिंग को जानने के लिए पायथन दुभाषिया की आवश्यकता होती है।

अगर आप U + 00A3 वापस करना चाहते हैं तो कह सकते हैं

return u'\u00a3'

जो यूनिकोड एस्केप सीक्वेंस के माध्यम से शुद्ध ASCII में इस चरित्र का प्रतिनिधित्व करता है। यदि आप शाब्दिक बाइट 0xA3 युक्त बाइट स्ट्रिंग वापस करना चाहते हैं, तो

return b'\xa3'

(जहां पायथन 2 में bनिहित है; लेकिन स्पष्ट रूप से निहित से बेहतर है)।

त्रुटि संदेश में लिंक किया गया PEP आपको ठीक से निर्देश देता है कि पायथन को कैसे बताया जाए "यह फ़ाइल शुद्ध ASCSI नहीं है; यहाँ एन्कोडिंग मैं उपयोग कर रहा हूँ"। यदि एन्कोडिंग UTF-8 है, तो यह होगा

# coding=utf-8

या Emacs- संगत

# -*- encoding: utf-8 -*-

यदि आप नहीं जानते हैं कि इस फाइल को सहेजने के लिए आपका संपादक कौन सा एन्कोडिंग इस्तेमाल करता है, तो इसे हेक्स एडिटर और कुछ गोग्लिंग जैसी चीज़ों से जाँचें। ढेर अतिप्रवाहटैग में अधिक जानकारी और कुछ समस्या निवारण युक्तियों के साथ टैग जानकारी पृष्ठ होता है।

इतने सारे शब्दों में, 7-बिट ASCII रेंज (0x00-0x7F) के बाहर, पायथन को अनुमान नहीं लगाया जा सकता है कि बाइट्स का एक क्रम किस स्ट्रिंग का प्रतिनिधित्व करता है। https://tripleee.github.io/8bit#a3 बाइट 0xA3 के लिए 21 संभावित व्याख्याएं दिखाता है और यह केवल विरासत 8-बिट एनकोडिंग से है; लेकिन यह बहु-बाइट एन्कोडिंग का पहला बाइट भी हो सकता है। लेकिन वास्तव में, मुझे लगता है कि आप वास्तव में लैटिन -1 का उपयोग कर रहे हैं, इसलिए आपके पास होना चाहिए

# coding: latin-1

आपके स्रोत फ़ाइल की पहली या दूसरी पंक्ति के रूप में। वैसे भी, बाइट किस चरित्र का प्रतिनिधित्व करने वाला है, इस बारे में ज्ञान के बिना, एक मानव यह अनुमान लगाने में सक्षम नहीं होगा।

एक चेतावनी: coding: latin-1निश्चित रूप से त्रुटि संदेश को हटा देगा (क्योंकि कोई बाइट अनुक्रम नहीं हैं जो तकनीकी रूप से इस एन्कोडिंग में अनुमत नहीं हैं), लेकिन कोड के व्याख्या किए जाने पर पूरी तरह से गलत परिणाम उत्पन्न हो सकता है यदि वास्तविक एन्कोडिंग कुछ और है। जब आप एन्कोडिंग की घोषणा करते हैं तो आपको वास्तव में फ़ाइल की एन्कोडिंग को पूरी निश्चितता के साथ जानना होता है।


यह मेरा एक पहले वाले उत्तर का एक अनुलिपि प्रश्न का एक रूपांतरण है: stackoverflow.com/a/50829958/874188
tripleee

स्रोत फ़ाइलों के लिए UTF-8 के लिए पायथन 3 डिफॉल्ट करता है, और आपको शायद इन दिनों वैसे भी सब कुछ के लिए UTF-8 का उपयोग करना चाहिए। utf8everywhere.org
ट्रिपल जू

8

स्क्रिप्ट में निम्नलिखित दो पंक्तियों को जोड़ने से मेरे लिए समस्या हल हो गई।

# !/usr/bin/python
# coding=utf-8

आशा करता हूँ की ये काम करेगा !


2

आप शायद पायथन 3 फ़ाइल को पायथन 2 दुभाषिया के साथ चलाने की कोशिश कर रहे हैं। वर्तमान में (2019 तक), pythonदोनों संस्करणों को स्थापित करने पर, विंडोज और अधिकांश लिनक्स वितरणों पर पायथन 2 को कमांड डिफॉल्ट करता है।

लेकिन अगर आप वास्तव में एक पायथन 2 स्क्रिप्ट पर काम कर रहे हैं, तो इस पृष्ठ समाधान पर अभी तक उल्लेख नहीं किया गया है फ़ाइल को UTF-8 + BOM एन्कोडिंग में फिर से लिखना है, जो फ़ाइल की शुरुआत में तीन विशेष बाइट जोड़ देगा, वे करेंगे स्पष्ट रूप से पायथन दुभाषिया (और आपके पाठ संपादक) को फ़ाइल एन्कोडिंग के बारे में सूचित करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.