Jeg er for nylig overgået til Py 3.5. Denne kode fungerede korrekt i 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
Efter opgradering til 3.5, I'm får den:
TypeError: a bytes-like object is required, not 'str'
fejl på den sidste linje (koden til mønstersøgning).
I've prøvet at bruge .decode()
funktion på begge sider af erklæringen, også prøvet:
if tmp.find('some-pattern') != -1: continue
- uden resultat.
Jeg var i stand til at løse næsten alle 2:3-problemer hurtigt, men dette lille udsagn irriterer mig.
Du åbnede filen i binær tilstand:
with open(fname, 'rb') as f:
Det betyder, at alle data, der læses fra filen, returneres som bytes
-objekter, ikke str
. Du kan derfor ikke bruge en streng i en indeslutningstest:
if 'some-pattern' in tmp: continue
Du'ville være nødt til at bruge et bytes
-objekt til at teste mod tmp
i stedet:
if b'some-pattern' in tmp: continue
eller åbne filen som en tekstfil i stedet ved at erstatte 'rb'
-tilstanden med 'r'
.
Som det allerede er blevet nævnt, læser du filen i binær tilstand og opretter derefter en liste af bytes. I din følgende for-loop sammenligner du strengen med bytes, og det er der, hvor koden fejler.
Afkodning af bytes, mens du tilføjer dem til listen, burde virke. Den ændrede kode bør se således ud:
with open(fname, 'rb') as f:
lines = [x.decode('utf8').strip() for x in f.readlines()]
Byte-typen blev indført i Python 3, og det er derfor, at din kode virkede i Python 2. I Python 2 var der ingen datatype for bytes:
>>> s=bytes('hello')
>>> type(s)
<type 'str'>
for dette lille eksempel: 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()
tilføjelse af "b" før 'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n' løste mit problem