base64.encodestring scheitern in python 3
Folgende Stück code erfolgreich ausgeführt über ein python-2 Maschine:
base64_str = base64.encodestring('%s:%s' % (username,password)).replace('\n', '')
Ich versuche die Portierung über Python 3, aber wenn ich tun, damit ich die folgende Fehlermeldung auftreten:
>>> a = base64.encodestring('{0}:{1}'.format(username,password)).replace('\n','')
Traceback (most recent call last):
File "/auto/pysw/cel55/python/3.4.1/lib/python3.4/base64.py", line 519, in _input_type_check
m = memoryview(s)
TypeError: memoryview: str object does not have the buffer interface
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/auto/pysw/cel55/python/3.4.1/lib/python3.4/base64.py", line 548, in encodestring
return encodebytes(s)
File "/auto/pysw/cel55/python/3.4.1/lib/python3.4/base64.py", line 536, in encodebytes
_input_type_check(s)
File "/auto/pysw/cel55/python/3.4.1/lib/python3.4/base64.py", line 522, in _input_type_check
raise TypeError(msg) from err
TypeError: expected bytes-like object, not str
Ich habe versucht, die Suche Beispiele für encodestring Verwendung, aber nicht in der Lage zu finden, ein gutes Dokument. Übersehe ich hier etwas offensichtliches? Ich führe dies auf RHEL-2.6.18-371.11.1.el5
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
encode()
string (umwandeln byte-string) , vor der übergabe inbase64.encodestring
. Beispiel ->>> base64_str = base64.encodestring(('%s:%s' % (username,password)).encode()).replace('\n', '') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: expected bytes, bytearray or buffer compatible object
Bitte beraten.decode()
rufen dazwischen (Hinzugefügt in der Antwort)encodestring
gibt ein byte-string, können wir nicht direkt nennenreplace()
auf Sie.Erweitern auf anands Antwort (was durchaus stimmt), Python 2 einen kleinen Unterschied zwischen "Hier ist ein string, das will ich behandeln, wie ein text" und "Hier ist ein string, das will ich behandeln, wie eine Folge von 8-bit-byte-Werte". Python 3 fest unterscheidet die beiden und lässt Sie nicht zu verwechseln: erstere ist die
str
Art, und die letztere ist derbytes
geben.Wenn Sie Base64-kodiert einen string, du bist nicht wirklich behandeln den string als text, Sie behandeln Sie es als eine Reihe von 8-bit-byte-Werte. Das ist, warum Sie werden immer ein Fehler von
base64.encodestring()
in Python 3: denn das ist eine operation, die sich mit der string-Zeichen als 8-bit-bytes, und so sollten Sie übergeben einen Parameter vom Typbytes
eher als einen parameter vom Typstr
.Daher, konvertieren Sie Ihre
str
- Objekt in einbytes
Objekt, Sie müssen rufen Sie Ihrenencode()
Methode, um es in einer Reihe von 8-bit-byte-Werte, egal in welchem Unicode-Codierung, die Sie gewählt haben, zu benutzen. (Sollte UTF-8 sein, es sei denn, Sie haben eine sehr spezifische Grund zu wählen ist etwas anderes, aber das ist ein anderes Thema).In Python 3 encodestring docs sagt:
Hier funktionierenden code für Python 3.5.1, es zeigt auch, wie die url-codieren:
(Ich bin sicher, es könnte mehr sein knappe, ich bin neu in Python...)
Siehe auch: http://pythoncentral.io/encoding-and-decoding-strings-in-python-3-x/