คำนำหน้า ab ก่อนสตริง python หมายถึงอะไร?


107

ในซอร์สโค้ด python ฉันสะดุดเมื่อฉันเห็นb ตัวเล็กก่อนสตริงเช่นใน:

b"abcdef"

ฉันรู้เกี่ยวกับuคำนำหน้าแสดงถึงสตริงยูนิโคดและrคำนำหน้าสำหรับลิเทอรัลสตริงดิบ

สิ่งที่ไม่bยืนและที่ชนิดของรหัสที่มาก็จะเป็นประโยชน์ในขณะที่มันน่าจะเป็นเหมือนกับสตริงธรรมดาโดยไม่ต้องคำนำหน้าใด ๆ


10
@SLott: ตามลิงค์ที่คุณให้มาคุณจะเห็นคำนำหน้า b ไม่ได้รับอนุญาตในคำนำหน้าสตริง ... สำหรับ 2.6 (ดูเหมือนข้อผิดพลาดเล็กน้อยในเอกสารอ้างอิง) และ Googling เกี่ยวกับสิ่งเหล่านี้ไม่ใช่เรื่องง่าย ฉันลองใช้คีย์เวิร์ดเช่น "b python string prefix" และไม่มีที่ไหนเลย
kriss

ลิงก์ S.Lott ที่ใช้ไม่มีตัวระบุเวอร์ชัน นี้เป็นเรื่องเกี่ยวกับงูหลาม 3: docs.python.org/3/reference/... ตอนนี้คำนำหน้าได้รับการสนับสนุนในPython 2.6 ขึ้นไปเพื่ออำนวยความสะดวกในการใช้รหัส Python ข้ามเวอร์ชัน
Martijn Pieters

1
คำถามนี้ไม่ใช่ "ซ้ำกันทุกประการ" หรือคำตอบสำหรับคำถาม "ฉันสามารถกำจัดอักขระ 'b' นี้ในคำสั่งพิมพ์ของฉันได้หรือไม่" stackoverflow.com/questions/42599851/…คุณช่วยยกเลิกการทำเครื่องหมายว่าโปรดมาริจินได้ไหม ผู้ที่ถามเช่นเดียวกับผู้ที่พยายามหาคำตอบจริง ๆ อาจพอใจที่สามารถตอบคำถามจริงที่ตั้งไว้ได้
me_

คำตอบ:


62

นี่คือ Python3 อักษรbytes คำนำหน้านี้ไม่มีอยู่ใน Python 2.5 และเก่ากว่า (เทียบเท่ากับสตริงธรรมดาที่ 2.x ในขณะที่สตริงธรรมดาของ 3.x เทียบเท่ากับลิเทอรัลที่มีuคำนำหน้าเป็น 2.x) ในหลาม 2.6+ มันเทียบเท่ากับสตริงธรรมดาเข้ากันได้กับ 3.x


@WRAR: อยู่ในรหัส python 2.6 ที่ฉันเห็นสิ่งนี้ดูเหมือนว่าจะถูกนำมาใช้ใน python2.6
kriss

ฉันตรวจสอบโดยเฉพาะในข้อมูลอ้างอิง 2.6 ก่อนโพสต์: docs.python.org/reference/lexical_analysis.html#literals
wRAR

1
ตกลง "เพื่อความเข้ากันได้ในอนาคต Python 2.6 จะเพิ่มไบต์เป็นคำพ้องความหมายสำหรับประเภท str และยังรองรับสัญกรณ์ b '' ด้วยจาก" มีอะไรใหม่ "
wRAR

เนื่องจากลิงก์ด้านบนชี้ไปที่การอ้างอิง 2.7 และมีการเพิ่มคำนำหน้า b นี่คือลิงก์ไปยังข้อมูลอ้างอิงปลอมเก่าdocs.python.org/release/2.6.8/reference/…
kriss

98

bคำนำหน้าหมายที่แท้จริงสตริงbytes

ถ้าคุณเห็นมันใช้ในหลาม 3 รหัสที่มาแสดงออกสร้างbytesวัตถุไม่ปกติUnicodestrวัตถุ หากคุณเห็นว่ามันสะท้อนอยู่ใน Python shell ของคุณหรือเป็นส่วนหนึ่งของ list, dict หรือเนื้อหาคอนเทนเนอร์อื่น ๆ คุณจะเห็นbytesอ็อบเจ็กต์ที่แสดงโดยใช้สัญกรณ์นี้

bytesโดยทั่วไปวัตถุจะมีลำดับของจำนวนเต็มในช่วง 0-255 แต่เมื่อเป็นตัวแทน Python จะแสดงไบต์เหล่านี้เป็นASCII codepointsเพื่อให้อ่านเนื้อหาได้ง่ายขึ้น ไบต์ใด ๆ นอกพิมพ์ช่วงของตัวอักษร ASCIIจะแสดงเป็นลำดับหนี (เช่น\n, \x82ฯลฯ ) ในทางกลับกันคุณสามารถใช้ทั้งอักขระ ASCII และลำดับ Escape เพื่อกำหนดค่าไบต์ สำหรับค่า ASCII จะใช้ค่าตัวเลข (เช่นb'A'== b'\x41')

เนื่องจากbytesออบเจ็กต์ประกอบด้วยลำดับของจำนวนเต็มคุณจึงสามารถสร้างbytesอ็อบเจกต์จากลำดับของจำนวนเต็มอื่น ๆ ที่มีค่าในช่วง 0-255 เช่นรายการ:

bytes([72, 101, 108, 108, 111])

และการสร้างดัชนีจะช่วยให้คุณกลับจำนวนเต็ม ( แต่หั่นผลิตใหม่bytesคุ้มค่าสำหรับตัวอย่างข้างต้นvalue[0]จะช่วยให้คุณ72แต่value[:1]เป็นb'H'72 เป็นจุดรหัส ASCII สำหรับตัวใหญ่H )

bytesแบบจำลองข้อมูลไบนารีรวมถึงข้อความที่เข้ารหัส หากbytesค่าของคุณมีข้อความคุณต้องถอดรหัสก่อนโดยใช้ตัวแปลงสัญญาณที่ถูกต้อง ตัวอย่างเช่นหากข้อมูลถูกเข้ารหัสเป็น UTF-8 คุณสามารถรับstrค่าUnicode ด้วย:

strvalue = bytesvalue.decode('utf-8')

ตรงกันข้ามจะไปจากข้อความในstrวัตถุbytesที่คุณจำเป็นต้องเข้ารหัส คุณต้องตัดสินใจเกี่ยวกับการเข้ารหัสที่จะใช้ ค่าเริ่มต้นคือใช้ UTF-8 แต่สิ่งที่คุณต้องการนั้นขึ้นอยู่กับกรณีการใช้งานของคุณเป็นอย่างมาก:

bytesvalue = strvalue.encode('utf-8')

คุณยังสามารถใช้ตัวสร้างbytes(strvalue, encoding)เพื่อทำเช่นเดียวกัน

ทั้งสองวิธีการถอดรหัสและการเข้ารหัสใช้อาร์กิวเมนต์พิเศษที่จะระบุว่าข้อผิดพลาดควรจะจัดการ

Python 2 เวอร์ชัน 2.6 และ 2.7 ยังรองรับการสร้างสตริงลิเทอรัลโดยใช้b'..'ไวยากรณ์แบบสตริงเพื่อลดความซับซ้อนของโค้ดที่ใช้ได้กับทั้ง Python 2 และ 3

bytesวัตถุไม่เปลี่ยนรูปเช่นเดียวกับstrสตริง ใช้bytearray()ออบเจ็กต์หากคุณต้องการมีค่าไบต์ที่ไม่แน่นอน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.