Làm cách nào để chuyển đổi một biến chuỗi byte 3 trong Python thành một chuỗi thông thường?


116

Tôi đã đọc trong một tệp đính kèm email XML với

bytes_string=part.get_payload(decode=False)

Trọng tải đến dưới dạng một chuỗi byte, như tên biến của tôi cho thấy.

Tôi đang cố gắng sử dụng phương pháp Python 3 được đề xuất để biến chuỗi này thành một chuỗi có thể sử dụng được mà tôi có thể thao tác.

Ví dụ cho thấy:

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

Làm cách nào để áp dụng bđối số từ khóa (byte) cho biến của tôi bytes_stringvà sử dụng phương pháp được đề xuất?

Cách tôi đã thử không hiệu quả:

str(bbytes_string, 'utf-8')

Câu trả lời:


210

Bạn đã có nó gần đúng ở dòng cuối cùng. Bạn muốn

str(bytes_string, 'utf-8')

bởi vì loại bytes_stringbytes, giống như loại b'abc'.


6
str(bytes_string, 'utf-8', 'ignore')Có thể bỏ qua lỗi bằng cách chuyển tham số thứ ba.
Shubhamoy

2
Có vẻ như đó phải là một nhận xét cho câu trả lời của pylang (giải quyết việc xử lý đầu vào không hợp lệ). Nếu (bạn tin rằng) không có gì sai bytes_string, tại sao bạn muốn bỏ qua lỗi?
Toby Speight

3
Tôi gặp lỗi sau với cách tiếp cận của bạn: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byteđối với chuỗi byte sau b'\xbf\x8cd\xba\x7f\xe0\xf0\xb8t\xfe.TaFJ\xad\x100\x07p\xa0\x1f90\xb7P\x8eP\x90\x06)0'@TobySpeight
alper

Chà @alper, đó không phải là một chuỗi UTF-8 hợp lệ, vậy bạn mong đợi điều gì?
Toby Speight

Cảm ơn vì giải pháp
Ajay Kumar

49

Gọi decode()một bytesphiên bản để lấy văn bản mà nó mã hóa.

str = bytes.decode()

5
UnicodeDecodeError: 'utf-8' giải mã không thể giải mã byte 0xf6 ở vị trí 230: bắt đầu byte không hợp lệ
Juha Untinen

3
@JuhaUntinen mã hóa của bạn có thể không phải là utf-8.
tommy.carstensen 22/09/2016

4
Làm cách nào để lọc (bỏ qua) các ký tự không phải UTF8 khỏi mảng?
Tiến sĩ Failov

9

ĐÃ CẬP NHẬT:

KHÔNG CÓ BẤT CỨ bvà dấu ngoặc kép ở đầu và cuối

Làm thế nào để chuyển đổi bytesnhư đã thấy thành chuỗi, ngay cả trong các tình huống kỳ lạ.

Vì mã của bạn có thể có các ký tự không thể nhận dạng để 'utf-8'mã hóa, nên tốt hơn là chỉ sử dụng str mà không có bất kỳ tham số bổ sung nào:

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

print(text)
Output: \x02-\xdfI

nếu bạn thêm 'utf-8'tham số, vào các byte cụ thể này, bạn sẽ nhận được lỗi.

Như tiêu chuẩn PYTHON 3 đã nói, textbây giờ sẽ có trong utf-8 mà không cần quan tâm.


Kết quả là "b '\\ x02 - \\ xdfI #)'" mà có lẽ không phải là những gì anh ta muốn
Glen Thompson

@GlenThompson nó chỉ là một ví dụ cho các điều kiện không mong muốn, có thể xảy ra. Tôi sử dụng văn bản cụ thể này một cách có chủ ý. Nếu bạn văn bản có nghĩa là có một bcâu trả lời trong đầu nó, sau đó tôi cập nhật
Seyfi

rất cảm ơn tôi đang tìm cách xóa ký tự b '' của một chuỗi có ký tự ansi mà không mã hóa và làm mất ký tự, tôi là người mới sử dụng python và không biết tôi có thể giảm một mảng từ đầu và bắt đầu sử dụng các chỉ mục: O
Diego Fernando Murillo Valenci

@DiegoFernandoMurilloValenci, chào mừng bạn. Rất vui vì tôi có thể giúp đỡ.
Seyfi

6

Làm cách nào để lọc (bỏ qua) các ký tự không phải UTF8 khỏi mảng?

Để giải quyết nhận xét này trong bài đăng của @ uname01 và OP, hãy bỏ qua các lỗi:

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

Chi tiết

Từ tài liệu , đây là các ví dụ khác sử dụng cùng một errorstham số:

>>> 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

Đối số lỗi chỉ định phản hồi khi chuỗi đầu vào không thể được chuyển đổi theo quy tắc của mã hóa. Giá trị pháp lý cho đối số này là 'strict'(nêu ra một UnicodeDecodeErrorngoại lệ), 'replace'(sử dụng U+FFFD, REPLACEMENT CHARACTER), hoặc 'ignore'(chỉ bỏ ký tự ra khỏi kết quả Unicode).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.