पायथन 3 में बाइट्स के लिए बी के बिना उपसर्ग दबाएं / प्रिंट करें


112

बस इसे पोस्ट करना इसलिए मैं इसे बाद में खोज सकता हूं, क्योंकि यह हमेशा मुझे स्टंप करता है:

$ python3.2
Python 3.2 (r32:88445, Oct 20 2012, 14:09:50) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import curses
>>> print(curses.version)
b'2.2'
>>> print(str(curses.version))
b'2.2'
>>> print(curses.version.encode('utf-8'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'bytes' object has no attribute 'encode'
>>> print(str(curses.version).encode('utf-8'))
b"b'2.2'"

प्रश्न के रूप में: उपसर्ग के bytesबिना पायथन 3 में एक बाइनरी ( ) स्ट्रिंग कैसे प्रिंट करें b'?


जवाबों:


111

उपयोग करें decode:

print(curses.version.decode())
# 2.2

1
@ जैमाइलक यह याद दिलाता है कि यह पैरामीटर को स्वीकार कर सकता है
जेमशीट इस्केंडरोव

1
डिफ़ॉल्ट रूप से यह कैसे करना है, मेरा मतलब है, क्या utf-8डिफ़ॉल्ट रूप से उपयोग करना बुरा है ? मैं .decode('utf-8')हर उस चीज का उपयोग नहीं करना चाहता जिसे मैं कुछ प्रिंट करता हूं।
शुभम ए।

कस्टम प्रिंट बनाएं
SmartManoj

यह देखना सुनिश्चित करें कि curses.versionकोई भी नहीं है
काउलिनेटर

24

यदि बाइट्स पहले से ही एक उपयुक्त वर्ण एन्कोडिंग का उपयोग करते हैं; आप उन्हें सीधे प्रिंट कर सकते हैं:

sys.stdout.buffer.write(data)

या

nwritten = os.write(sys.stdout.fileno(), data)  # NOTE: it may write less than len(data) bytes

12

यदि हम bytes.__repr__इसके लिए स्रोत पर एक नज़र डालते हैं , तो ऐसा लगता b''है कि विधि में बेक किया गया है।

सबसे स्पष्ट वर्कअराउंड मैन्युअल रूप b''से परिणामस्वरूप से टुकड़ा करना है repr():

>>> x = b'\x01\x02\x03\x04'

>>> print(repr(x))
b'\x01\x02\x03\x04'

>>> print(repr(x)[2:-1])
\x01\x02\x03\x04

6
साइड नोट: मुझे नहीं लगता कि कोई अन्य उत्तर वास्तव में प्रश्न का उत्तर देता है।
मतीन उल्हाक

मुझे लगता है कि मैं सहमत हो जाऊंगा: आपका समाधान, अर्थात् repr(x)[2:-1], एक strवस्तु का उत्पादन करता है जो इच्छा के रूप में प्रिंट करेगा। विशेष रूप से, repr(b'\x01')[2:-1]स्ट्रिंग लौटाता है \\x01, जबकि decode()वह वापसी करेगा \x01जो किसी के साथ काम नहीं करेगा print()। अधिक स्पष्ट होने के लिए, print(repr(b'\x01')[2:-1])प्रिंट करेगा \x01जबकि print(b'\x01'.decode())कुछ भी प्रिंट नहीं करेगा।
एंटोनी

वैकल्पिक रूप से, print(repr(b"\x01".decode()))प्रिंट होगा '\x01', (एकल उद्धरण सहित एक स्ट्रिंग) ताकि print(repr(b"\x01".decode())[1:-1])प्रिंट \x01(एकल उद्धरण चिह्नों के बिना एक स्ट्रिंग)।
एंटोनी 14

11

यदि डेटा UTF-8 संगत प्रारूप में है, तो आप बाइट्स को एक स्ट्रिंग में बदल सकते हैं।

>>> import curses
>>> print(str(curses.version, "utf-8"))
2.2

यदि डेटा पहले से ही UTF-8 संगत नहीं है, तो वैकल्पिक रूप से सबसे पहले हेक्स में कनवर्ट करें। जब डेटा वास्तविक कच्चे बाइट्स हैं।

from binascii import hexlify
from codecs import encode  # alternative
>>> print(hexlify(b"\x13\x37"))
b'1337'
>>> print(str(hexlify(b"\x13\x37"), "utf-8"))
1337
>>>> print(str(encode(b"\x13\x37", "hex"), "utf-8"))
1337
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.