एक स्ट्रिंग शाब्दिक के सामने 'बी' चरित्र क्या करता है?


830

स्पष्ट रूप से, निम्नलिखित सिंटैक्स है:

my_string = b'The string'

मैं जानना चाहता हूँ:

  1. bस्ट्रिंग के सामने इस चरित्र का क्या अर्थ है?
  2. इसका उपयोग करने के क्या प्रभाव हैं?
  3. इसका उपयोग करने के लिए उपयुक्त परिस्थितियां क्या हैं?

मुझे एसओ पर संबंधित प्रश्न यहीं मिला , लेकिन यह सवाल हालांकि PHP के बारे में है, और यह बताता bहै कि स्ट्रिंग को द्विआधारी इंगित करने के लिए उपयोग किया जाता है, जैसा कि यूनिकोड के विपरीत है, जिसे PHP <6 के संस्करण से संगत होने के लिए कोड की आवश्यकता थी। , जब PHP 6 की ओर पलायन हो रहा है। मुझे नहीं लगता कि यह पायथन पर लागू होता है।

मुझे पायथन साइट पर यूनिकोड के रूप में एक स्ट्रिंग को निर्दिष्ट करने के लिए एक ही सिंटैक्स में एक चरित्र का उपयोग करने के बारे में यह प्रलेखन मिला u। दुर्भाग्य से, यह उस दस्तावेज़ में कहीं भी बी चरित्र का उल्लेख नहीं करता है ।

इसके अलावा, बस जिज्ञासा से बाहर, वहाँ और अधिक से अधिक प्रतीकों bऔर uअन्य चीजें हैं?

जवाबों:


416

पायथन 2.x प्रलेखन उद्धृत करने के लिए :

पायथन 2 में 'बी' या 'बी' के एक उपसर्ग को अनदेखा किया गया है; यह इंगित करता है कि पायथन 3 में शाब्दिक एक बाइट्स शाब्दिक बनना चाहिए (उदाहरण के लिए जब कोड स्वचालित रूप से 2to3 के साथ परिवर्तित हो जाता है)। एक 'u' या 'b' उपसर्ग 'r' उपसर्ग के बाद हो सकता है।

अजगर 3 प्रलेखन कहता है:

बाइट्स शाब्दिक हमेशा 'बी' या 'बी' के साथ उपसर्ग होते हैं; वे बाइट प्रकार के बजाय स्ट्रैस प्रकार का एक उदाहरण उत्पन्न करते हैं। उनमें केवल ASCII वर्ण हो सकते हैं; 128 या अधिक के संख्यात्मक मान के साथ बाइट्स को पलायन के साथ व्यक्त किया जाना चाहिए।


4
तो ऐसा लगता है कि पायथन <v3 सिर्फ इस अतिरिक्त चरित्र को अनदेखा करेगा। V3 में एक मामला क्या होगा जहाँ आपको सिर्फ एक नियमित स्ट्रिंग के विपरीत ab string का उपयोग करने की आवश्यकता होगी?
जेसी वेब वेब

5
@Gweebz - यदि आप वास्तव में यूनिकोड से बचने के बजाय एक विशेष एन्कोडिंग में एक स्ट्रिंग टाइप कर रहे हैं (उदाहरण के लिए, '\ uffe1' के बजाय b '\ xff \ xfe \ xe12')।
2

7
वास्तव में, यदि आप unicode_literalsसे आयात किया गया है __future__, तो यह इस विशेष स्ट्रिंग के लिए व्यवहार को "उल्टा" करेगा (पायथन 2.x में)
रोमेलुड ब्रुनेट

33
उद्धृत प्रलेखन के आसपास थोड़ी अधिक स्पष्ट भाषा की कहानी यह एक बेहतर उत्तर बना देगी IMHO
Hack-R

2
अन्यथा, किसी ऐसे व्यक्ति के लिए एक उत्तर है जो पहले से ही इसे समझता है।
राफेल इयंग

676

पायथन 3.x प्रकारों के बीच एक स्पष्ट अंतर बनाता है:

  • str= '...'शाब्दिक = यूनिकोड वर्णों का एक क्रम (UTF-16 या UTF-32, यह निर्भर करता है कि पायथन कैसे संकलित किया गया था)
  • bytes= b'...'शाब्दिक = सप्तक का एक क्रम (0 और 255 के बीच पूर्णांक)

यदि आप Java या C # से परिचित हैं, तो strजैसा Stringऔर bytesजैसा सोचें byte[]। यदि आप SQL से परिचित हैं, तो strजैसा NVARCHARऔर bytesजैसा BINARYया वैसा समझें BLOB। यदि आप Windows रजिस्ट्री से परिचित हैं, तो strजैसा REG_SZऔर bytesजैसा सोचें REG_BINARY। यदि आप C (++) से परिचित हैं, तो आपके द्वारा सीखे गए charऔर तार के बारे में सब कुछ भूल जाएं , क्योंकि एक CHARACTER एक BYTE नहीं है । यह विचार लंबे समय से पुराना है।

strजब आप पाठ का प्रतिनिधित्व करना चाहते हैं तो आप उपयोग करते हैं।

print('שלום עולם')

आप का उपयोग bytesजब आप structs की तरह निम्न स्तर बाइनरी डेटा का प्रतिनिधित्व करना चाहते हैं।

NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]

आप कर सकते हैं सांकेतिक शब्दों में बदलना एक strएक करने के लिए bytesवस्तु।

>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'

और आप एक bytesमें एक डिकोड कर सकते हैं str

>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'

लेकिन आप स्वतंत्र रूप से दो प्रकारों का मिश्रण नहीं कर सकते।

>>> b'\xEF\xBB\xBF' + 'Text with a UTF-8 BOM'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str

b'...'अंकन कुछ हद तक में भ्रमित यह 0x01-0x7F बाइट्स हेक्स संख्या के बजाय ASCII वर्ण साथ निर्दिष्ट किया जा करने की अनुमति देता है कि है।

>>> b'A' == b'\x41'
True

लेकिन मुझे जोर देना चाहिए, एक चरित्र बाइट नहीं है

>>> 'A' == b'A'
False

पायथन में 2.x

पायथन के पूर्व 3.0 संस्करणों में पाठ और बाइनरी डेटा के बीच इस तरह के अंतर का अभाव था। इसके बजाय, वहाँ था:

  • unicode= u'...'शाब्दिक = यूनिकोड वर्णों का क्रम = 3.xstr
  • str= '...'शाब्दिक = भ्रमित बाइट्स / वर्णों के अनुक्रम
    • आमतौर पर पाठ, कुछ अनिर्दिष्ट एन्कोडिंग में एन्कोडेड।
    • लेकिन struct.packआउटपुट जैसे बाइनरी डेटा का प्रतिनिधित्व करने के लिए भी उपयोग किया जाता है ।

2.x-to-3. -x संक्रमण को कम करने के लिए, पाठ के तार (जो 3 में होना चाहिए) में b'...'द्विआधारी तारों (जो bytes3.x में होना चाहिए ) को अलग करने की अनुमति देने के लिए शाब्दिक वाक्यविन्यास पायथन 2.6 को वापस भेज दिया गया था। str।एक्स)। bउपसर्ग 2.x में कुछ नहीं करता है, लेकिन बताता 2to3स्क्रिप्ट यह 3.x. में एक यूनिकोड स्ट्रिंग के लिए कनवर्ट करने के लिए नहीं

तो हाँ, b'...'पायथन में शाब्दिक का वही उद्देश्य है जो वे PHP में करते हैं।

इसके अलावा, बस जिज्ञासा से बाहर, क्या बी और यू की तुलना में अधिक प्रतीक हैं जो अन्य चीजें करते हैं?

rउपसर्ग एक कच्चे स्ट्रिंग बनाता है (उदाहरण के लिए, r'\t'एक बैकस्लैश + है tबजाय एक टैब), और ट्रिपल कोट्स '''...'''या """..."""बहु लाइन स्ट्रिंग शाब्दिक अनुमति देते हैं।


2
धन्यवाद! मैंने इन वाक्यों को पढ़ने के बाद इसे समझा: "2.x-to-3.x संक्रमण को कम करने के लिए, b '...' शाब्दिक सिंटैक्स को बाइनरी स्ट्रिंग्स को अलग करने की अनुमति देने के लिए पायथन 2.6 को वापस भेज दिया गया था (जो चाहिए टेक्स्ट स्ट्रिंग्स से 3.x में बाइट करें (जो 3.x में स्ट्रैट होना चाहिए)। b प्रीफिक्स 2.x में कुछ भी नहीं करता है, लेकिन 2to3 स्क्रिप्ट को बताता है कि इसे 3.x में यूनिकोड स्ट्रिंग में परिवर्तित न करें। "
tommy.carstensen

4
'A' == b'A' --> Falseजांच वास्तव में यह स्पष्ट कर देता है। यह बाकी उत्कृष्ट है, लेकिन उस बिंदु तक मैं ठीक से समझ नहीं पाया था कि एक बाइट स्ट्रिंग वास्तव में पाठ नहीं है।
वाइल्डकार्ड

12
'שלום עולם' == 'hello world'
एली

12
यह स्वीकार किए गए उत्तर की तुलना में बहुत अधिक स्पष्ट है जो सिर्फ प्रलेखन को उद्धृत कर रहा है। मेरे लिए दस्तावेज़ीकरण का कोई मतलब नहीं था इसलिए दस्तावेज़ीकरण में और संदर्भ प्रदान करना भयानक है। धन्यवाद!
किरण

2
b "कुछ स्ट्रिंग" .decode ('UTF-8'), मेरा मानना ​​है कि बहुत से लोग इस लाइन को देख रहे हैं
Marvin Thobejane

22

बी एक बाइट स्ट्रिंग को दर्शाता है।

बाइट्स वास्तविक डेटा हैं। स्ट्रिंग्स एक अमूर्त है।

यदि आपके पास बहु-वर्ण स्ट्रिंग ऑब्जेक्ट था और आपने एकल वर्ण लिया, तो यह एक स्ट्रिंग होगा, और यह एन्कोडिंग के आधार पर आकार में 1 बाइट से अधिक हो सकता है।

यदि एक बाइट स्ट्रिंग के साथ 1 बाइट लिया जाता है, तो आपको 0-255 से एक एकल 8-बिट मान मिलेगा और यह पूर्ण वर्ण का प्रतिनिधित्व नहीं कर सकता है यदि एन्कोडिंग के कारण वे वर्ण> 1 बाइट थे।

टीबीएच मैं स्ट्रिंग्स का उपयोग करता हूं जब तक कि बाइट्स का उपयोग करने के लिए मेरे पास कुछ विशिष्ट निम्न स्तर का कारण न हो।


16

सर्वर की ओर से, यदि हम कोई प्रतिक्रिया भेजते हैं, तो इसे बाइट प्रकार के रूप में भेजा जाएगा, इसलिए यह ग्राहक के रूप में दिखाई देगा b'Response from server'

आदेश में b'....'नीचे दिए गए कोड से बस उपयोग से छुटकारा पाएं :

सर्वर फ़ाइल:

stri="Response from server"    
c.send(stri.encode())

ग्राहक फ़ाइल:

print(s.recv(1024).decode())

तो यह प्रिंट होगा Response from server


1
यह उस प्रश्न की व्याख्या नहीं करता है जो जेसी वेब ने पूछा है!
चंद्र कंठ

मैं कह रहा था कि एन्कोड और डिकोड विधियों का उपयोग किए बिना, स्ट्रिंग आउटपुट को बी '' के साथ उपसर्ग किया जाएगा क्योंकि अजगर इसे स्ट्रिंग टाइप की बजाय बाइट प्रकार के रूप में लेते हैं। यदि आप बी जैसे आउटपुट प्राप्त नहीं करना चाहते हैं ... 'ऊपर का उपयोग करें कि यह क्या है। आप समझ में नहीं आया क्या?
नानी चिंचा

वास्तव में यह उस प्रश्न के शीर्षक का उत्तर है जो पूछा गया था: Q: "b'x क्या करता है?" A: "यह 'x'.encode () करता है" जो कि शाब्दिक रूप से यह करता है। बाकी सवाल इससे कहीं अधिक जानना चाहते थे, लेकिन शीर्षक का उत्तर दिया गया है।
माइकल एरिकसन

10

यहां एक उदाहरण है जहां अनुपस्थिति पायथन 3.x में bएक TypeErrorअपवाद को फेंक देगी

>>> f=open("new", "wb")
>>> f.write("Hello Python!")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' does not support the buffer interface

bउपसर्ग जोड़ने से समस्या ठीक हो जाएगी।


9

यह इसे bytesशाब्दिक (या str2.x) में बदल देता है , और 2.6+ के लिए मान्य है।

rउपसर्ग के कारण होता है "uninterpreted" किए जाने की बैकस्लैश (उपेक्षा नहीं की, और अंतर करता है बात)।


यह ऐक्स के उत्तर में उद्धृत प्रलेखन के अनुसार गलत लगता है; b को 3.th के अलावा Python वर्जन में नजरअंदाज किया जाएगा।
Jesse Webb

2
यह strकिसी भी तरह से 2.x में होगा , इसलिए यह कहा जा सकता है कि इसे अनदेखा किया गया है। मॉड्यूल unicode_literalsसे आयात करते समय अंतर मायने रखता है __future__
इग्नासियो वाज़क्वेज़-अब्राम्स

6

दूसरों ने जो कहा है, इसके अलावा, ध्यान दें कि यूनिकोड में एक एकल चरित्र में कई बाइट्स हो सकते हैं

जिस तरह से यूनिकोड काम करता है वह पुराने ASCII प्रारूप (7-बिट कोड जो 0xxx xxxx जैसा दिखता है) को ले गया और मल्टी-बाइट्स अनुक्रम जोड़े जहां सभी बाइट्स CCII से परे वर्णों का प्रतिनिधित्व करने के लिए 1 (1xxx xxxx) से शुरू करते हैं ताकि यूनिकोड पीछे की ओर हो जाए ASCII के साथ संगत

>>> len('Öl')  # German word for 'oil' with 2 characters
2
>>> 'Öl'.encode('UTF-8')  # convert str to bytes 
b'\xc3\x96l'
>>> len('Öl'.encode('UTF-8'))  # 3 bytes encode 2 characters !
3

2

आप इसे शब्दकोश में बदलने के लिए JSON का उपयोग कर सकते हैं

import json
data = b'{"key":"value"}'
print(json.loads(data))

{"मौलिक मूल्य"}


फ्लास्क:

यह फ्लास्क से एक उदाहरण है। इसे टर्मिनल लाइन पर चलाएँ:

import requests
requests.post(url='http://localhost(example)/',json={'key':'value'})

फ्लास्क / मार्गों में

@app.route('/', methods=['POST'])
def api_script_add():
    print(request.data) # --> b'{"hi":"Hello"}'
    print(json.loads(request.data))
return json.loads(request.data)

{'मौलिक मूल्य'}

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