Jak przekonwertować zmienną będącą ciągiem bajtów języka Python 3 na zwykły ciąg?

116

Przeczytałem w załączniku e-mail XML z

bytes_string=part.get_payload(decode=False)

Ładunek pojawia się jako ciąg bajtów, jak sugeruje nazwa mojej zmiennej.

Próbuję użyć zalecanego podejścia Python 3, aby przekształcić ten ciąg w użyteczny ciąg, którym mogę manipulować.

Przykład pokazuje:

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

Jak mogę zastosować bargument słowa kluczowego (bajty) do mojej zmiennej bytes_stringi zastosować zalecane podejście?

Sposób, w jaki próbowałem, nie działa:

str(bbytes_string, 'utf-8')
DjangoTango
źródło

Odpowiedzi:

210

Miałeś to prawie dokładnie w ostatniej linii. Chcesz

str(bytes_string, 'utf-8')

ponieważ typ bytes_stringjest bytestaki sam jak typ b'abc'.

Toby Speight
źródło
6
str(bytes_string, 'utf-8', 'ignore')Błędy można zignorować, przekazując trzeci parametr.
Shubhamoy
2
Wygląda na to, że powinien to być komentarz do odpowiedzi pylanga (która dotyczy obsługi nieprawidłowych danych wejściowych). Jeśli (tak uważasz) nie ma w tym nic złego bytes_string, dlaczego miałbyś chcieć ignorować błędy?
Toby Speight
3
Otrzymuję następujący błąd z twoim podejściem: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start bytedla następującego ciągu bajtów b'\xbf\x8cd\xba\x7f\xe0\xf0\xb8t\xfe.TaFJ\xad\x100\x07p\xa0\x1f90\xb7P\x8eP\x90\x06)0'@TobySpeight
alper
Cóż, @alper, to nie jest prawidłowy ciąg znaków UTF-8, więc czego się spodziewałeś?
Toby Speight
Dzięki za rozwiązanie
Ajay Kumar
49

Zadzwoń decode()na bytesprzykład, aby uzyskać tekst, który koduje.

str = bytes.decode()
uname01
źródło
5
UnicodeDecodeError: kodek 'utf-8' nie może zdekodować bajtu 0xf6 na pozycji 230: nieprawidłowy bajt początkowy
Juha Untinen
3
@JuhaUntinen Twoje kodowanie prawdopodobnie nie jest utf-8.
tommy.carstensen
4
Jak odfiltrować (pominąć) znaki inne niż UTF8 z tablicy?
Dr Failov,
9

AKTUALIZACJA:

NIE MAĆ ŻADNYCH bi cytatów na początku i na końcu

Jak konwertować bytesna ciągi znaków, nawet w dziwnych sytuacjach.

Ponieważ Twój kod może zawierać nierozpoznawalne znaki do 'utf-8'zakodowania, lepiej jest użyć po prostu str bez żadnych dodatkowych parametrów:

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

print(text)
Output: \x02-\xdfI

jeśli dodasz 'utf-8' parametr do tych konkretnych bajtów, powinieneś otrzymać błąd.

Jak mówi standard PYTHON 3, textbyłby teraz w utf-8 bez obaw.

Seyfi
źródło
wynik to „b '\\ x02 - \\ xdfI #)'”, co prawdopodobnie nie jest tym, czego on chce
Glen Thompson
@GlenThompson to tylko przykład niechcianych warunków, które mogą się zdarzyć. Celowo używam tego konkretnego tekstu. Jeśli masz na myśli tekst ma bpierwsze z nich, to zaktualizowałem odpowiedź
Seyfi
więc bardzo dziękuję, szukam sposobu na usunięcie b '' ciągu, który ma znak ansi bez kodowania i utraty znaków, jestem nowy w Pythonie i nie wiem, czy mogę zmniejszyć tablicę od początku i początek używania indeksów: O
Diego Fernando Murillo Valenci
@DiegoFernandoMurilloValenci, witamy. Cieszę się, że mogę pomóc.
Seyfi
6

Jak odfiltrować (pominąć) znaki inne niż UTF8 z tablicy?

Aby rozwiązać ten komentarz w poście @ uname01 i OP, zignoruj ​​błędy:

Kod

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

Detale

Z dokumentacji , oto więcej przykładów używających tego samego errorsparametru:

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

Argument błędów określa odpowiedź, gdy ciąg wejściowy nie może zostać przekonwertowany zgodnie z regułami kodowania. Prawidłowe wartości tego argumentu to 'strict'( UnicodeDecodeErrorzgłoś wyjątek), 'replace'(użyj U+FFFD, REPLACEMENT CHARACTER) lub 'ignore'(po prostu pozostaw znak poza wynikiem Unicode).

pylang
źródło