Anmerkung: Ich werde meine Antwort für Python 3 weiter ausarbeiten, da das Ende der Lebensdauer von Python 2 sehr nahe ist.
In Python 3
bytes
besteht aus Folgen von 8-Bit-Werten ohne Vorzeichen, während str
besteht aus Folgen von Unicode-Codepunkten, die Textzeichen aus menschlichen Sprachen darstellen.
>>> # bytes
>>> b = b'h\x65llo'
>>> type(b)
<class 'bytes'>
>>> list(b)
[104, 101, 108, 108, 111]
>>> print(b)
b'hello'
>>>
>>> # str
>>> s = 'nai\u0308ve'
>>> type(s)
<class 'str'>
>>> list(s)
['n', 'a', 'i', '', 'v', 'e']
>>> print(s)
naive
Auch wenn bytes
y str
auf die gleiche Weise zu funktionieren scheinen, sind ihre Instanzen nicht miteinander kompatibel, d.h, bytes
y str
Instanzen können nicht zusammen mit Operatoren verwendet werden wie >
y +
. Außerdem ist zu bedenken, dass ein Vergleich bytes
y str
Instanzen auf Gleichheit, d.h. mit ==
wird immer ausgewertet zu False
auch wenn sie genau dieselben Zeichen enthalten.
>>> # concatenation
>>> b'hi' + b'bye' # this is possible
b'hibye'
>>> 'hi' + 'bye' # this is also possible
'hibye'
>>> b'hi' + 'bye' # this will fail
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat str to bytes
>>> 'hi' + b'bye' # this will also fail
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "bytes") to str
>>>
>>> # comparison
>>> b'red' > b'blue' # this is possible
True
>>> 'red'> 'blue' # this is also possible
True
>>> b'red' > 'blue' # you can't compare bytes with str
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'bytes' and 'str'
>>> 'red' > b'blue' # you can't compare str with bytes
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'str' and 'bytes'
>>> b'blue' == 'red' # equality between str and bytes always evaluates to False
False
>>> b'blue' == 'blue' # equality between str and bytes always evaluates to False
False
Ein weiteres Problem beim Umgang mit bytes
y str
ist vorhanden, wenn mit Dateien gearbeitet wird, die mit der Funktion open
eingebaute Funktion. Wenn Sie einerseits binäre Daten aus einer Datei lesen oder in eine Datei schreiben wollen, öffnen Sie die Datei immer in einem Binärmodus wie 'rb' oder 'wb'. Wenn Sie andererseits Unicode-Daten aus einer Datei lesen oder in eine Datei schreiben wollen, achten Sie auf die Standardkodierung Ihres Computers und übergeben Sie gegebenenfalls die encoding
Parameter, um Überraschungen zu vermeiden.
In Python 2
str
besteht aus Folgen von 8-Bit-Werten, während unicode
besteht aus Folgen von Unicode-Zeichen. Eine Sache, die Sie beachten sollten, ist, dass str
y unicode
kann zusammen mit Operatoren verwendet werden, wenn str
besteht nur aus 7-Bit-ASCI-Zeichen.
Es könnte nützlich sein, Hilfsfunktionen zu verwenden, um zwischen str
y unicode
in Python 2, und zwischen bytes
y str
in Python 3.