ฉันจะแปลงตัวแปร Python 3 byte-string เป็นสตริงปกติได้อย่างไร


117

ฉันได้อ่านในไฟล์แนบอีเมล XML กับ

bytes_string=part.get_payload(decode=False)

เพย์โหลดมาในรูปแบบสตริงไบต์ตามที่ชื่อตัวแปรของฉันแนะนำ

ฉันพยายามใช้วิธี Python 3 ที่แนะนำเพื่อเปลี่ยนสตริงนี้ให้เป็นสตริงที่ใช้งานได้ซึ่งฉันสามารถจัดการได้

ตัวอย่างแสดง:

str(b'abc','utf-8')

ฉันจะใช้bอาร์กิวเมนต์คำสำคัญ (ไบต์) กับตัวแปรของฉันbytes_stringและใช้แนวทางที่แนะนำได้อย่างไร

วิธีที่ฉันลองใช้ไม่ได้ผล:

str(bbytes_string, 'utf-8')

คำตอบ:


210

คุณมาเกือบถึงบรรทัดสุดท้ายแล้ว คุณต้องการ

str(bytes_string, 'utf-8')

เนื่องจากประเภทของbytes_stringคือbytesเหมือนกับประเภทของb'abc'.


6
str(bytes_string, 'utf-8', 'ignore')ข้อผิดพลาดสามารถละเว้นได้โดยการส่งผ่านพารามิเตอร์ที่สาม
Shubhamoy

2
ดูเหมือนว่ามันควรจะเป็นความคิดเห็นสำหรับคำตอบของ pylang (ซึ่งจัดการกับอินพุตที่ไม่ถูกต้อง) ถ้า (คุณเชื่อว่า) ไม่มีอะไรผิดปกติbytes_stringทำไมคุณถึงต้องการละเว้นข้อผิดพลาด?
Toby Speight

3
ฉันได้รับดังต่อไปนี้ข้อผิดพลาดกับวิธีการของคุณ: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byteสำหรับต่อไปนี้ไบต์สตริงb'\xbf\x8cd\xba\x7f\xe0\xf0\xb8t\xfe.TaFJ\xad\x100\x07p\xa0\x1f90\xb7P\x8eP\x90\x06)0'@TobySpeight
Alper

@alper นั่นไม่ใช่สตริง UTF-8 ที่ถูกต้องคุณคาดหวังอะไร
Toby Speight

ขอบคุณสำหรับการแก้ปัญหา
Ajay Kumar

49

เรียกdecode()ใช้bytesอินสแตนซ์เพื่อรับข้อความที่เข้ารหัส

str = bytes.decode()

5
UnicodeDecodeError: ตัวแปลงสัญญาณ 'utf-8' ไม่สามารถถอดรหัสไบต์ 0xf6 ในตำแหน่ง 230: ไบต์เริ่มต้นที่ไม่ถูกต้อง
Juha Untinen

3
@JuhaUntinen การเข้ารหัสของคุณอาจไม่ใช่ utf-8
tommy.carstensen

4
วิธีการกรอง (ข้าม) อักขระที่ไม่ใช่ UTF8 จากอาร์เรย์
Dr. Failov

9

ปรับปรุง:

ไม่มีbคำพูดใด ๆและคำพูดในตอนแรกและตอนท้าย

วิธีการแปลงbytesตามที่เห็นเป็นสตริงแม้ในสถานการณ์แปลก ๆ

เนื่องจากโค้ดของคุณอาจมีอักขระที่ไม่สามารถจดจำได้ในการ'utf-8'เข้ารหัสจึงควรใช้แค่ str โดยไม่มีพารามิเตอร์เพิ่มเติม:

some_bad_bytes = b'\x02-\xdfI#)'
text = str( some_bad_bytes )[2:-1]

print(text)
Output: \x02-\xdfI

หากคุณเพิ่ม'utf-8'พารามิเตอร์ลงในไบต์เฉพาะเหล่านี้คุณควรได้รับข้อผิดพลาด

ตามที่มาตรฐาน PYTHON 3 กล่าวไว้ตอนนี้textจะอยู่ใน utf-8 โดยไม่ต้องกังวล


ผลลัพธ์คือ "b '\\ x02 - \\ xdfI #)'" ซึ่งอาจไม่ใช่สิ่งที่เขาต้องการ
Glen Thompson

@GlenThompson เป็นเพียงตัวอย่างสำหรับเงื่อนไขที่ไม่ต้องการที่อาจเกิดขึ้น ฉันใช้ข้อความเฉพาะนี้โดยเจตนา หากคุณหมายถึงข้อความมีbอยู่ก่อนฉันจะอัปเดตคำตอบ
Seyfi

ขอบคุณมากฉันกำลังค้นหาวิธีลบ b '' ของสตริงที่มีอักขระ ansi โดยไม่ต้องเข้ารหัสและสูญเสียอักขระฉันเป็นคนใหม่ใน python และไม่รู้ว่าฉันสามารถลดอาร์เรย์ได้ตั้งแต่เริ่มต้นและ เริ่มต้นใช้ดัชนี: O
Diego Fernando Murillo Valenci

@DiegoFernandoMurilloValenci ยินดีต้อนรับคุณ ดีใจที่ช่วยได้
Seyfi

6

วิธีการกรอง (ข้าม) อักขระที่ไม่ใช่ UTF8 จากอาร์เรย์

หากต้องการแสดงความคิดเห็นนี้ในโพสต์ของ @ uname01 และ OP ให้ละเว้นข้อผิดพลาด:

รหัส

>>> b'\x80abc'.decode("utf-8", errors="ignore")
'abc'

รายละเอียด

จากเอกสารต่อไปนี้เป็นตัวอย่างเพิ่มเติมโดยใช้errorsพารามิเตอร์เดียวกัน:

>>> b'\x80abc'.decode("utf-8", "replace")
'\ufffdabc'
>>> b'\x80abc'.decode("utf-8", "backslashreplace")
'\\x80abc'
>>> b'\x80abc'.decode("utf-8", "strict")  
Traceback (most recent call last):
    ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:
  invalid start byte

อาร์กิวเมนต์ข้อผิดพลาดระบุการตอบสนองเมื่อไม่สามารถแปลงสตริงอินพุตตามกฎของการเข้ารหัส ค่าทางกฎหมายสำหรับอาร์กิวเมนต์นี้คือ'strict'(เพิ่มUnicodeDecodeErrorข้อยกเว้น), 'replace'(ใช้U+FFFD, REPLACEMENT CHARACTER) หรือ'ignore'(เพียงแค่ปล่อยอักขระออกจากผลลัพธ์ Unicode)

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