Ich bin kürzlich auf Py 3.5 migriert. Dieser Code funktionierte in Python 2.7 ordnungsgemäß:
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 erhalte ich Folgendes:
TypeError: a bytes-like object is required, not 'str'
Fehler in der letzten Zeile (der Mustersuchcode).
Ich habe versucht, die .decode()
Funktion auf beiden Seiten der Anweisung zu verwenden. Außerdem habe ich versucht:
if tmp.find('some-pattern') != -1: continue
- umsonst.
Ich konnte fast alle 2: 3-Probleme schnell lösen, aber diese kleine Aussage nervt mich.
result = requests.get
und es versuchex = result.content.split("\n")
. Ich bin ein wenig verwirrt von der Fehlermeldung, weil es zu implizieren scheint, dassresult.content
es sich um eine Zeichenfolge.split()
handelt und ein byteähnliches Objekt erforderlich ist. ("einAntworten:
Sie haben die Datei im Binärmodus geöffnet:
Dies bedeutet, dass alle aus der Datei gelesenen Daten als
bytes
Objekte zurückgegeben werden, nichtstr
. Sie können dann keine Zeichenfolge in einem Containment-Test verwenden:Sie müssten stattdessen ein
bytes
Objekt zum Testentmp
verwenden:oder öffnen Sie die Datei stattdessen als Textdatei, indem Sie den
'rb'
Modus durch ersetzen'r'
.quelle
'r'
vs'rb'
zu , das Umschalten zwischen Binär- und Textdatei Verhalten (wie das Übersetzen Zeilenumbrüche und auf bestimmten Plattformen, wie die EOF - Markierung behandelt wird). Dass dieio
Bibliothek (die die Standard-E / A-Funktionalität in Python 3 bereitstellt, aber auch in Python 2 verfügbar ist) jetzt auch standardmäßig Textdateien dekodiert, ist die eigentliche Änderung.'b'
Flag nur verwendet, wenn ich unter DOS / Windows mit Binärdateien arbeiten musste (da Binär die POSIX-Standardeinstellung ist). Es ist gut, dass es einen doppelten Zweck gibt, wennio
in 3.x für den Dateizugriff verwendet wird.Sie können Ihre Zeichenfolge mit codieren
.encode()
Beispiel:
quelle
Wie bereits erwähnt, lesen Sie die Datei im Binärmodus und erstellen dann eine Liste von Bytes. In Ihrer folgenden for- Schleife vergleichen Sie Zeichenfolgen mit Bytes, und hier schlägt der Code fehl.
Das Dekodieren der Bytes beim Hinzufügen zur Liste sollte funktionieren. Der geänderte Code sollte wie folgt aussehen:
Der Bytetyp wurde in Python 3 eingeführt, und deshalb funktionierte Ihr Code in Python 2. In Python 2 gab es keinen Datentyp für Bytes:
quelle
Sie müssen von wb zu w wechseln:
zu
Nachdem Sie dies geändert haben, verschwindet der Fehler, aber Sie können nicht in die Datei schreiben (in meinem Fall). Also habe ich doch keine Antwort?
Quelle: So entfernen Sie ^ M.
Das Ändern zu 'rb' bringt mir den anderen Fehler: io.UnsupportedOperation: write
quelle
für dieses kleine Beispiel: Socket importieren
Das Hinzufügen des "b" vor "GET http://www.py4inf.com/code/romeo.txt HTTP / 1.0 \ n \ n" löste mein Problem
quelle
Verwenden Sie die Funktion encode () zusammen mit dem fest codierten String-Wert in einem einfachen Anführungszeichen.
Ex:
ODER
quelle
Sie haben die Datei im Binärmodus geöffnet:
Der folgende Code löst einen TypeError aus: Ein byteähnliches Objekt ist erforderlich, nicht 'str'.
Der folgende Code funktioniert - Sie müssen die Funktion decode () verwenden:
quelle
Warum nicht versuchen, Ihre Datei als Text zu öffnen?
Zusätzlich gibt es hier einen Link für Python 3.x auf der offiziellen Seite: https://docs.python.org/3/library/io.html Und dies ist die offene Funktion: https://docs.python.org/3 /library/functions.html#open
Wenn Sie wirklich versuchen, es als Binärdatei zu behandeln, sollten Sie Ihre Zeichenfolge codieren.
quelle
Ich habe diesen Fehler erhalten, als ich versucht habe, ein Zeichen (oder einen String) in zu konvertieren.
bytes
Der Code war mit Python 2.7 ungefähr so:Dies ist der Weg von Python 2.7 beim Umgang mit Unicode-Zeichen.
Dies funktioniert mit Python 3.6 nicht, da
bytes
ein zusätzliches Argument für die Codierung erforderlich ist. Dies kann jedoch etwas schwierig sein, da unterschiedliche Codierungen unterschiedliche Ergebnisse liefern können:In meinem Fall musste ich
iso_8859_1
beim Codieren von Bytes verwenden, um das Problem zu lösen.Hoffe das hilft jemandem.
quelle