2013-03-29 14 views
22

W Pythonie 3, można sformatować ciąg jak:Python 3 bajty formatowania

"{0}, {1}, {2}".format(1, 2, 3) 

Ale jak formatować bajtów?

b"{0}, {1}, {2}".format(1, 2, 3) 

podnosi AttributeError: 'bytes' object has no attribute 'format'.

Jeśli nie ma metody bajtów dla metody format, należy wykonać formatowanie lub "przepisanie" bajtów?

Odpowiedz

18

Formatowanie będzie działało także dla dla bytes!

https://mail.python.org/pipermail/python-dev/2014-March/133621.html

+0

słodko! Mam nadzieję, że tak, ponieważ w ten sposób formatowane są ciągi C, haha ​​ – vitiral

+6

Lol. Najpierw wyrzucili funkcje 2.x lub zepsuł je, a później przynieśli u. '' literały (ale ur '' jest zabronione!), formatowanie ciągów bajtowych. 'open()' otwiera się domyślnie w kodowaniu specyficznym dla systemu - dobrze, w 2.x mają kod, który się zepsuł, jeśli jest używany z nie -ascii symbole, w 3.x zastąpiły go kodem, który zepsuje się, jeśli jest używany na komputerach z systemem Windows, ponieważ "lokalne" kodowanie jest stroną kodową ascii. Czy warto było najpierw przełamać kompilację, aby przywrócić połowę funkcji? –

+5

Czy to jest oznacza, że ​​'%' nie jest już planowane do wycofania? –

10

Co ciekawe, .format() nie wydaje się być obsługiwane dla sekwencji bajtów; jak wykazałeś.

Można użyć .join() jak sugeruje tutaj: http://bugs.python.org/issue3982

b", ".join([b'1', b'2', b'3']) 

Jest zaletą prędkości związane z .join() nad użyciem .format() przedstawiony przez samego BDFL: http://bugs.python.org/msg180449

+0

Dzięki! Wiadomość od BDFL jest również świetnym znaleziskiem. Nie rozwiązuje to jednak formatowania, powiedzmy, elementów pływających. Byłoby interesujące dowiedzieć się, czy istnieje jakakolwiek inna droga poza 'str (some_bytes) .encode()' –

+0

Zrozum. Metoda '.format()' dla bajtów wydaje się być na ścieżce do włączenia w 3.4 + – bernie

+1

@bernie: Ale metoda '__format__' obiektu i wbudowany' format' zwraca 'str'. Jak to będzie działać z 'bajtami' i kodowaniem? – eryksun

5

Innym sposobem byłoby:

"{0}, {1}, {2}".format(1, 2, 3).encode() 

Testowane na IPythonie 1.1.0 & Python 3 .2.3

+7

To nie działa, jeśli argumenty formatu są bajtami: – user3467349

1

znalazłem% pracującą najlepiej w Pythonie 3.6.2, powinien on pracować zarówno dla b "" i "":

print(b"Some stuff %a. Some other stuff" % my_byte_or_unicode_string) 
+1

@Chris dobry połów, 3.6.2 –