Co oznacza prefiks ab przed ciągiem znaków Pythona?

107

W kodzie źródłowym Pythona, na który natknąłem się, widziałem małe b przed ciągiem znaków, jak w:

b"abcdef"

Wiem o uprefiksie oznaczającym ciąg znaków Unicode i rprefiksie dla surowego literału ciągu.

Co to boznacza iw jakim rodzaju kodu źródłowego jest przydatny, ponieważ wydaje się być dokładnie taki sam, jak zwykły ciąg bez żadnego przedrostka?

kriss
źródło
10
@SLott: podążaj za podanym linkiem, zobaczysz, że prefiks b nie jest dozwolony w prefiksie ciągu ... dla 2.6 (wygląda na drobny błąd w materiale referencyjnym). Googlowanie na ten temat nie jest łatwe. Próbowałem słów kluczowych, takich jak „prefiks ciągu b pythona” i praktycznie nic nie osiągnąłem.
kriss
W używanym łączu S.Lott brakuje specyfikatora wersji; chodzi o Python 3: docs.python.org/3/reference/… . Prefiks jest teraz obsługiwany również w Pythonie 2.6 i nowszych, aby ułatwić kod Pythona w różnych wersjach.
Martijn Pieters
1
to pytanie nie jest ani „dokładnym duplikatem”, ani odpowiedzią na pytanie „Czy mogę pozbyć się tego znaku„ b ”z instrukcji drukowania?” stackoverflow.com/questions/42599851/ ... czy mógłbyś odznaczyć to, proszę, marijin? osoba, która zadała pytanie, jak również osoba, która faktycznie próbowała odpowiedzieć, może docenić możliwość uzyskania odpowiedzi na faktycznie zadane pytanie.
me_

Odpowiedzi:

62

To jest bytes dosłowny język Python3 . Ten przedrostek jest nieobecny w Pythonie 2.5 i starszych (jest równoważny zwykłemu ciągowi 2.x, podczas gdy zwykły ciąg 3.x jest równoważny literałowi z uprefiksem w 2.x). W Pythonie 2.6+ jest odpowiednikiem zwykłego łańcucha, pod kątem zgodności z 3.x .

wRAR
źródło
@WRAR: Byłem w kodzie Pythona 2.6 Widziałem to, wygląda na to, że zostało wprowadzone w pythonie2.6
kriss
Dokładnie
wRAR
1
OK, „Aby zapewnić przyszłą zgodność, Python 2.6 dodaje bajty jako synonim typu str, a także obsługuje notację b ''.” Z „Co nowego”.
WRAR
ponieważ powyższe linki wskazują teraz odniesienie 2.7, a przedrostek b został dodany, tutaj jest łącze do starej fałszywej referencji docs.python.org/release/2.6.8/reference/ ...
kriss
98

bPrefiks oznacza się bytesciągiem znaków .

Jeśli widzisz, że jest używany w kodzie źródłowym Python 3, wyrażenie tworzy bytesobiekt , a nie zwykły obiekt Unicodestr . Jeśli zobaczysz, że odbija się to echem w Twojej powłoce Pythona lub jako część listy, dyktu lub innej zawartości kontenera, to zobaczysz bytesobiekt reprezentowany za pomocą tej notacji.

bytesobiekty zasadniczo zawierają sekwencję liczb całkowitych z zakresu 0-255, ale gdy są reprezentowane, Python wyświetla te bajty jako punkty kodowe ASCII, aby ułatwić odczytanie ich zawartości. Wszelkie bajtów poza druku zakresu znaków ASCII przedstawiono jako sekwencje (na przykład \n, \x82i inne). I odwrotnie, do definiowania wartości bajtów można używać zarówno znaków ASCII, jak i sekwencji sterujących; dla wartości ASCII używana jest ich wartość liczbowa (np. b'A'== b'\x41')

Ponieważ bytesobiekt składa się z sekwencji liczb całkowitych, możesz skonstruować bytesobiekt z dowolnej innej sekwencji liczb całkowitych o wartościach z zakresu 0-255, takich jak lista:

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

a indeksowanie zwraca liczby całkowite (ale wycinanie daje nową byteswartość; w powyższym przykładzie value[0]daje 72, ale value[:1]wynosi b'H'72 to punkt kodowy ASCII dla dużej litery H ).

bytesmodelować dane binarne , w tym zakodowany tekst . Jeśli twoja byteswartość zawiera tekst, musisz go najpierw zdekodować, używając odpowiedniego kodeka. Jeśli na przykład dane są zakodowane w formacie UTF-8, można uzyskać strwartość Unicode za pomocą:

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

I odwrotnie, aby przejść od tekstu w strobiekcie do byteskodu, należy go zakodować . Musisz zdecydować, jakiego kodowania użyć; Domyślnie używa się UTF-8, ale to, czego będziesz potrzebować, zależy w dużym stopniu od twojego przypadku użycia:

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

Możesz również użyć konstruktora, bytes(strvalue, encoding)aby zrobić to samo.

Obie metody dekodowania i kodowania pobierają dodatkowy argument, aby określić, jak powinny być obsługiwane błędy .

Python 2, wersje 2.6 i 2.7 obsługują również tworzenie literałów ciągów przy użyciu b'..'składni literałów łańcuchowych, aby ułatwić kod, który działa zarówno w Pythonie 2, jak i 3.

bytesobiekty są niezmienne, podobnie jak strłańcuchy. Użyj bytearray()obiektu, jeśli potrzebujesz mutowalnej wartości bajtów.

Martijn Pieters
źródło