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

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


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

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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.