Recientemente he migrado a Py 3.5. Este código funcionaba correctamente en 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
Después de actualizar a 3.5, I'm conseguir el:
TypeError: a bytes-like object is required, not 'str'
error en la última línea (el código de búsqueda de patrones).
He intentado usar la función .decode()
a ambos lados de la declaración, también he probado:
if tmp.find('some-pattern') != -1: continue
\ ~ - en vano.
Pude resolver casi todos los problemas de 2:3 rápidamente, pero esta pequeña declaración me molesta.
Has abierto el archivo en modo binario:
with open(fname, 'rb') as f:
Esto significa que todos los datos leídos del archivo se devuelven como objetos bytes
, no str
. No puede entonces utilizar una cadena en una prueba de contención:
if 'some-pattern' in tmp: continue
Tendría que usar un objeto bytes
para probar contra tmp
en su lugar:
if b'some-pattern' in tmp: continue
o abrir el archivo como un archivo de texto sustituyendo el modo 'rb'
por 'r'
.
Como ya se ha mencionado, estás leyendo el archivo en modo binario y luego creando una lista de bytes. En tu siguiente bucle for estás comparando la cadena con los bytes y ahí es donde el código está fallando.
Decodificar los bytes mientras se añaden a la lista debería funcionar. El código modificado debería tener el siguiente aspecto:
with open(fname, 'rb') as f:
lines = [x.decode('utf8').strip() for x in f.readlines()]
El tipo bytes fue introducido en Python 3 y por eso tu código funcionaba en Python 2. En Python 2 no había ningún tipo de datos para bytes:
>>> s=bytes('hello')
>>> type(s)
<type 'str'>
para este pequeño ejemplo: importar 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()
añadiendo la "b" antes de 'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n' solucionó mi problema