Ich bin vor kurzem auf Py 3.5 umgestiegen. Dieser Code funktionierte 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 erhalte ich Folgendes:
TypeError: a bytes-like object is required, not 'str'
fehler in der letzten Zeile (der Mustersuchcode).
Ich habe versucht, die Funktion .decode()
auf beiden Seiten der Anweisung zu verwenden.
if tmp.find('some-pattern') != -1: continue
- umsonst.
Ich konnte fast alle 2: 3-Probleme schnell lösen, aber diese kleine Aussage nervt mich.
Sie haben die Datei im Binärmodus geöffnet:
with open(fname, 'rb') as f:
Dies bedeutet, dass alle aus der Datei gelesenen Daten als bytes
Objekte zurückgegeben werden, nicht als str
. Sie können dann keine Zeichenfolge in einem Eindämmungstest verwenden:
if 'some-pattern' in tmp: continue
Sie müssten stattdessen ein bytes
-Objekt zum Testen gegen tmp
verwenden:
if b'some-pattern' in tmp: continue
oder öffnen Sie die Datei als Textdatei, indem Sie den 'rb'
-Modus durch 'r'
ersetzen.
Sie können Ihre Zeichenfolge mit .encode()
codieren.
Beispiel:
'Hello World'.encode()
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 Zeichenfolge mit Bytes, und an dieser Stelle schlägt der Code fehl.
Das Dekodieren der Bytes während des Hinzufügens zur Liste sollte funktionieren. Der geänderte Code sollte wie folgt aussehen:
with open(fname, 'rb') as f:
lines = [x.decode('utf8').strip() for x in f.readlines()]
Der Bytetyp wurde in Python 3 eingeführt, und deshalb hat Ihr Code in Python 2 funktioniert. In Python 2 gab es keinen Datentyp für Bytes:
>>> s=bytes('hello')
>>> type(s)
<type 'str'>
Sie müssen von wb zu w wechseln:
def __init__(self):
self.myCsv = csv.writer(open('Item.csv', 'wb'))
self.myCsv.writerow(['title', 'link'])
zu
def __init__(self):
self.myCsv = csv.writer(open('Item.csv', 'w'))
self.myCsv.writerow(['title', 'link'])
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: Wie entferne ich ^ M
Der Wechsel zu 'rb' bringt mir den anderen Fehler: io.UnsupportedOperation: write
für dieses kleine Beispiel: Import Socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send(**b**'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')
while True:
data = mysock.recv(512)
if ( len(data) < 1 ) :
break
print (data);
mysock.close()
hinzufügen des "b" vor "GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n" hat mein Problem gelöst
Sie haben die Datei im Binärmodus geöffnet:
Der folgende Code löst einen TypeError aus: Es ist ein byteähnliches Objekt erforderlich, nicht 'str'.
for line in lines:
print(type(line))# <class 'bytes'>
if 'substring' in line:
print('success')
Der folgende Code funktioniert - Sie müssen die Funktion decode () verwenden:
for line in lines:
line = line.decode()
print(type(line))# <class 'str'>
if 'substring' in line:
print('success')
warum nicht versuchen, Ihre Datei als Text zu öffnen?
with open(fname, 'rt') as f:
lines = [x.strip() for x in f.readlines()]
Außerdem gibt es hier einen Link für python 3.x auf der offiziellen Seite: https://docs.python.org/3/library/io.html Und das 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 die Zeichenfolge verschlüsseln.
Verwenden Sie die Funktion encode () zusammen mit dem fest codierten Zeichenfolgenwert in einem einfachen Anführungszeichen.
Ex:
file.write(answers[i] + '\n'.encode())
OR
line.split(' +++$+++ '.encode())