TypeError: ein bytes-Objekt wie erforderlich ist, nicht 'str' beim schreiben in eine Datei in Python ist3
Ich habe vor kurzem migriert Py 3.5.
Dieser code wurde ordnungsgemäß in Python 2.7:
with open(fname, 'rb') as f:
lines = [x.strip() for x in f.readlines()]
for line in lines:
tmp = line.strip().lower()
if 'some-pattern' in tmp: continue
# ... code
Nach dem Upgrade auf 3.5, ich bin immer die:
TypeError: a bytes-like object is required, not 'str'
Fehler in der letzten Zeile (das pattern-search-code).
Ich habe versucht, mit der .decode()
Funktion auf beiden Seiten der Anweisung, auch versucht:
if tmp.find('some-pattern') != -1: continue
- ohne Erfolg.
Konnte ich lösen fast alle 2:3 Themen schnell, aber diese kleine Aussage nervt mich.
- Warum sind Sie öffnen die Datei im binary-Modus, aber behandeln Sie es als text?
- Dank für das Auffinden der Datei-öffnen-Modus! Ändern Sie text-Modus-gelöst ist das Problem... der code hatte funktioniert zuverlässig in Py2k seit vielen Jahren, obwohl...
- siehe: python.org/dev/peps/pep-0404/#strings-and-bytes
- Ich bin die Begegnung mit dieser zu, wo ich Anfragen
result = requests.get
und ich Versuchx = result.content.split("\n")
. Ich bin ein wenig verwirrt durch die Fehlermeldung, da scheint es zu implizieren, dassresult.content
ist ein string, der.split()
die eine Byte-Objekt wie..?? ( "ein bytes-Objekt wie erforderlich ist, nicht 'str"')..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Öffnete die Datei im binary-Modus:
Dies bedeutet, dass alle Daten aus der Datei gelesen wird zurückgegeben, als
bytes
Objekte, nichtstr
. Sie können dann verwenden Sie eine Zeichenfolge, die in einem containment-test:Würden Sie einen
bytes
Objekt zu testen, gegentmp
statt:oder öffnen Sie die Datei als Textdatei statt durch den Austausch der
'rb'
- Modus mit'r'
.'r'
vs'rb'
auch, der Wechsel zwischen Binär-und text-Datei Verhaltensweisen (wie die übersetzung Zeilenumbrüchen und auf bestimmten Plattformen, wie die EOF-marker behandelt wird). Dass dieio
Bibliothek (bereitstellen der Standard-I/O-Funktionalität in Python 3, aber auch in Python 2) jetzt auch decodiert die text-Dateien standardmäßig ist die wirkliche Veränderung.'b'
Flagge beim arbeiten mit Binär-Dateien auf DOS/Windows (als binary ist der POSIX-Standard). Es ist gut, dass es einen doppelten Zweck bei der Verwendungio
im 3.x für die Datei access.Kodieren Sie die Zeichenfolge mithilfe
.encode()
Beispiel:
Wie bereits erwähnt, Sie Lesen die Datei im binary-Modus und erstellt dann eine Liste von bytes. In Ihrem folgenden für Schleife Sie einen Vergleich-string in bytes und das ist, wo der code nicht.
Dekodierung der bytes, die beim hinzufügen zu der Liste funktionieren sollte. Der geänderte code sollte wie folgt Aussehen:
Den bytes-Typ eingeführt wurde in Python 3 und das ist, warum Ihr code arbeitete in Python 2. In Python 2 gab es keinen Datentyp für ein Byte:
für dieses kleine Beispiel:
import socket
hinzufügen der "b" vor
'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n'
mein problem gelöst
Müssen Sie ändern von wb w:
zu
Nach änderung dieser, die Fehlermeldung verschwindet, aber man kann nicht in die Datei schreiben (in meinem Fall). So, nachdem alle, ich habe darauf keine Antwort?
Quelle: Wie entfernen ^M
Wechsel zu 'rb' bringt mir den Fehler: io.UnsupportedOperation: schreiben
warum nicht versuchen, öffnen der Datei als text?
Zusätzlich hier ist ein link für python 3.x auf der offiziellen Seite:
https://docs.python.org/3/library/io.html
Und dies ist der open-Funktion: https://docs.python.org/3/library/functions.html#open
Wenn Sie wirklich versuchen, es zu handhaben wie eine binäre betrachten Sie dann, der Kodierung der Zeichenfolge.
Öffnete die Datei im binary-Modus:
Den folgenden code werfen
ein TypeError: ein bytes-Objekt wie erforderlich ist, nicht 'str'.
Der folgende code funktioniert - Sie müssen verwenden Sie die decode () - Funktion:
Mit encode () - Funktion zusammen mit hartcodierten Zeichenfolge in einfache Anführungszeichen.
Ex:
ODER