kzen.dev
  • Frågor
  • Taggar
  • Användare
Meddelanden
Belöningar
Registrering
När du har registrerat dig kommer du att få information om svar och kommentarer på dina frågor.
Logga in
Om du redan har ett konto loggar du in för att kontrollera nya meddelanden.
Det kommer att finnas belöningar för frågor, svar och kommentarer.
Mer
Källa
Redigera
Mark Ransom
Mark Ransom
Question

Bästa sättet att konvertera strängar till bytes i Python 3?

Det verkar finnas två olika sätt att konvertera en sträng till bytes, vilket framgår av svaren på https://stackoverflow.com/questions/5471158/typeerror-str-does-not-support-the-buffer-interface.

Vilken av dessa metoder skulle vara bättre eller mer Pythonisk? Eller är det bara en fråga om personliga preferenser?

b = bytes(mystring, 'utf-8')

b = mystring.encode('utf-8')
718 2011-09-28T15:14:07+00:00 3
 Community
Community
Redigerad fråga 2017ör maj 2017 в 11:54
Programmering
character-encoding
python
string
python-3.x
Popular videos
Section, Week 5
Section, Week 5
för 8 år sedan
Section 9
Section 9
för 9 år sedan
Review: Quiz 1
Review: Quiz 1
för 11 år sedan
From C to Python by Ross Rheingans-Yoo
From C to Python by Ross Rheingans-Yoo
för 7 år sedan
Binary 4 – Floating Point Binary Fractions 1
Binary 4 – Floating Point Binary Fractions 1
för 4 år sedan
Supersection 1, More Comfortable
Supersection 1, More Comfortable
för 9 år sedan
CS50 2013 - Week 2, continued
CS50 2013 - Week 2, continued
för 9 år sedan
CS50 2015 - Week 1, continued
CS50 2015 - Week 1, continued
för 8 år sedan
CS50 2014 - Week 7
CS50 2014 - Week 7
för 9 år sedan
Review: Quiz 0
Review: Quiz 0
för 11 år sedan
PHP Syntax
PHP Syntax
för 8 år sedan
Statistical Programming with R by Connor Harris
Statistical Programming with R by Connor Harris
för 8 år sedan
Sortering i Python
Sortering i Python
för 2 år sedan
Enkla beräkningar i Python
Enkla beräkningar i Python
för 2 år sedan
5. (Python) Variabler och regler
5. (Python) Variabler och regler
för 2 år sedan
208 Strängar i manualen samt heredoc och nowdoc
208 Strängar i manualen samt heredoc och nowdoc
för 7 år sedan
207 Strängar med dubbelfnutt eller enkelfnutt
207 Strängar med dubbelfnutt eller enkelfnutt
för 7 år sedan
[Grunder] Variabler för heltal, flyttal och strängar
[Grunder] Variabler för heltal, flyttal och strängar
för 4 år sedan
Hur frågar man på svenska? (olika sätt att fråga) SFI
Hur frågar man på svenska? (olika sätt att fråga) SFI
för 1 år sedan
PYTHON : Best way to convert string to bytes in Python 3?
PYTHON : Best way to convert string to bytes in Python 3?
för 1 år sedan
Best way to convert string to bytes in Python 3
Best way to convert string to bytes in Python 3
för 2 år sedan
Python 3 How to convert string to bytes
Python 3 How to convert string to bytes
för 5 år sedan
Kom igång med PHP: Variabler i strängar
Kom igång med PHP: Variabler i strängar
för 9 år sedan
Konverteringsoptimering 3/5 - Hur ökar jag min Konverteringsgrad?
Konverteringsoptimering 3/5 - Hur ökar jag min Konverteringsgrad?
för 4 år sedan
Konverteringsoptimering 1/5 - Tre frågor att ställa Google Analytics om Konverteringsoptimering
Konverteringsoptimering 1/5 - Tre frågor att ställa Google Analytics om Konverteringsoptimering
för 4 år sedan
DVA128 - Tips inför Case 4
DVA128 - Tips inför Case 4
för 2 år sedan
Return Statements - Python
Return Statements - Python
för 3 år sedan
Konverteringsoptimering 4/5 - Hur minskar jag bortfallet i konverteringstratten?
Konverteringsoptimering 4/5 - Hur minskar jag bortfallet i konverteringstratten?
för 4 år sedan
CS50 2013 - Week 2
CS50 2013 - Week 2
för 9 år sedan
« Föregående
Nästa »
Solution / Answer
 agf
agf
2011ör september 2011 в 3:27
2011-09-28T15:27:58+00:00
Mer
Källa
Redigera
#13486931

Om du tittar på dokumentationen för bytes hänvisar den dig till [bytearray] (https://docs.python.org/3/library/functions.html#func-bytearray):

bytearray([source[, encoding[, errors]]])

Returnerar en ny array av bytes. Bytearray-typen är en föränderlig sekvens av heltal i intervallet 0 <= x < 256. Den har de flesta av de vanliga metoderna för föränderliga sekvenser, som beskrivs i Mutabla sekvenstyper, samt de flesta metoder som bytes-typen har, se Metoder för bytes- och byte-arrayer.

Den valfria källparametern kan användas för att initialisera matrisen på några olika sätt:

__Om det är en sträng måste du också ange parametrarna för kodning (och eventuellt fel); bytearray() omvandlar sedan strängen till bytes med hjälp av str.encode().___

Om det är ett heltal kommer arrayen att ha den storleken och initialiseras med noll bytes.

Om det är ett objekt som överensstämmer med buffertgränssnittet kommer en skrivskyddad buffert av objektet att användas för att initialisera bytesarrayn.

Om det är en iterabel måste det vara en iterabel av heltal i intervallet 0 <= x < 256, som används som det initiala innehållet i matrisen.

Och utan argument skapas en array av storlek 0.

Så bytes kan göra mycket mer än att bara koda en sträng. Det är Pythoniskt att det skulle tillåta dig att anropa konstruktören med vilken typ av källparameter som helst som är meningsfull.

När det gäller kodning av en sträng anser jag att some_string.encode(encoding) är mer Pythoniskt än att använda konstruktören, eftersom det är det mest självdokumenterande - "ta den här strängen och koda den med den här kodningen" är tydligare än bytes(some_string, encoding) - det finns inget explicit verb när du använder konstruktören.

Redigering: Jag har kontrollerat Pythons källkod. Om du skickar en unicode-sträng till bytes med hjälp av CPython, anropar den PyUnicode_AsEncodedString, som är implementeringen av encode; så du hoppar bara över en indirekt nivå om du anropar encode själv.

Se även Serdalis' kommentar -- unicode_string.encode(encoding) är också mer Pythoniskt eftersom dess omvänt är byte_string.decode(encoding) och symmetri är trevligt.

Garrett Hyde
Garrett Hyde
Redigerat svar 2017ör oktober 2017 в 4:42
cpython: 5a12416890c0 Objects/unicodeobject.c
hg.python.org
Built-in Functions &#8212; Python 3.10.7 documentation
docs.python.org
512
0
Do you have a question? Add it on the site and get an answer instantly
en.kzen.dev
 hasanatkazmi
hasanatkazmi
2013ör juli 2013 в 7:09
2013-07-06T07:09:28+00:00
Mer
Källa
Redigera
#13486933

Det är lättare än man tror:

my_str = "hello world"
my_str_as_bytes = str.encode(my_str)
type(my_str_as_bytes) # ensure it is byte representation
my_decoded_str = my_str_as_bytes.decode()
type(my_decoded_str) # ensure it is string representation
 vinzee
vinzee
Redigerat svar 2019ör juni 2019 в 12:27
277
0
Do you have a question? Add it on the site and get an answer instantly
en.kzen.dev
Antti Haapala
Antti Haapala
2017ör juli 2017 в 8:35
2017-07-23T20:35:05+00:00
Mer
Källa
Redigera
#13486934

Det absolut bästa sättet är inget av de två, utan det tredje. Den första parametern till encode försvinner till 'utf-8' ända sedan Python 3.0. Det bästa sättet är alltså

b = mystring.encode()

Detta blir också snabbare, eftersom standardargumentet inte resulterar i strängen &"utf-8" i C-koden, utan NULL, vilket är mycket snabbare att kontrollera!

Här är några tidsangivelser:

In [1]: %timeit -r 10 'abc'.encode('utf-8')
The slowest run took 38.07 times longer than the fastest. 
This could mean that an intermediate result is being cached.
10000000 loops, best of 10: 183 ns per loop

In [2]: %timeit -r 10 'abc'.encode()
The slowest run took 27.34 times longer than the fastest. 
This could mean that an intermediate result is being cached.
10000000 loops, best of 10: 137 ns per loop

Trots varningen var tiderna mycket stabila efter upprepade körningar - avvikelsen var bara ~2 procent.


Att använda encode() utan argument är inte Python 2-kompatibelt, eftersom standardkodsningen i Python 2 är ASCII.

>>> 'äöä'.encode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Antti Haapala
Antti Haapala
Redigerat svar 2018ör juni 2018 в 7:21
Built-in Types &#8212; Python 3.10.7 documentation
docs.python.org
105
0
Lägg till en fråga
Kategorier
Alla
Teknik
Kultur / fritid
Livet / Konst
Vetenskap
Professionell
Företag
Användare
Alla
Ny
Populära
1
Andrei Kalinin
Registrerad för 2 veckor sedan
2
Koroleva Ego
Registrerad för 1 månad sedan
3
Star Lenon
Registrerad för 1 månad sedan
4
Данил Жевнеров
Registrerad för 1 månad sedan
5
Анна Литвиненко
Registrerad för 2 månader sedan
Do you have a question? Add it on the site and get an answer instantly
en.kzen.dev
DA
DE
EL
ES
FR
ID
IT
JA
LT
NL
NO
PL
PT
RO
RU
SV
TR
ZH
© kzen.dev 2023
Källa
stackoverflow.com
under licens cc by-sa 3.0 med angivande av