it-swarm.com.de

TypeError: Ein byteähnliches Objekt ist erforderlich, nicht 'str', wenn in Python3 in eine Datei geschrieben wird

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.

445
masroore

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.

432
Martijn Pieters

Sie können Ihre Zeichenfolge mit .encode() codieren.

Beispiel:

'Hello World'.encode()
138
theofpa

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'>
34
Suresh

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

15
meck373

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

13
starter

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')
5
Matan Hugi

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.

3

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())
2
ShivBuyya