Recientemente migré 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, obtengo el:
TypeError: a bytes-like object is required, not 'str'
error en la última línea (el código de búsqueda del patrón).
Intenté usar la .decode()
función a cada lado de la declaración, también probé:
if tmp.find('some-pattern') != -1: continue
- en vano.
Pude resolver casi todos los problemas 2: 3 rápidamente, pero esta pequeña declaración me está molestando.
result = requests.get
y lo intentox = result.content.split("\n")
. Estoy un poco confundido por el mensaje de error porque parece implicar queresult.content
es una cadena y.split()
requiere un objeto de tipo bytes ... ?? ("se requiere un objeto similar a bytes, no 'str"') ..Respuestas:
Abriste el archivo en modo binario:
Esto significa que todos los datos leídos del archivo se devuelven como
bytes
objetos, nostr
. Entonces no puede usar una cadena en una prueba de contención:Tendría que usar un
bytes
objeto para probar en sutmp
lugar:o abra el archivo como un archivo de texto reemplazando el
'rb'
modo con'r'
.fuente
'r'
vs'rb'
demasiado , el cambio entre las conductas de archivos binarios y de texto (como los saltos de línea que traducen y en ciertas plataformas, cómo se trata el marcador EOF). Que laio
biblioteca (que proporciona la funcionalidad de E / S predeterminada en Python 3 pero también disponible en Python 2) ahora también decodifica archivos de texto de forma predeterminada es el cambio real.'b'
indicador cuando tuve que trabajar con archivos binarios en DOS / Windows (ya que binario es el valor predeterminado de POSIX). Es bueno que haya un doble propósito cuando se usaio
en 3.x para el acceso a archivos.Puedes codificar tu cadena usando
.encode()
Ejemplo:
fuente
Como ya se mencionó, está leyendo el archivo en modo binario y luego está creando una lista de bytes. En tu seguimiento por bucle , está comparando cadena a bytes y ahí es donde falla el código.
La decodificación de los bytes mientras se agrega a la lista debería funcionar. El código modificado debería tener el siguiente aspecto:
El tipo de bytes se introdujo en Python 3 y es por eso que su código funcionó en Python 2. En Python 2 no había ningún tipo de datos para bytes:
fuente
Tienes que cambiar de wb a w:
a
Después de cambiar esto, el error desaparece, pero no puede escribir en el archivo (en mi caso). Entonces, después de todo, ¿no tengo una respuesta?
Fuente: Cómo eliminar ^ M
Cambiar a 'rb' me trae el otro error: io.UnsupportedOperation: write
fuente
para este pequeño ejemplo: zócalo de importación
agregar la "b" antes de 'GET http://www.py4inf.com/code/romeo.txt HTTP / 1.0 \ n \ n' resolvió mi problema
fuente
Use la función encode () junto con el valor String codificado en una comilla simple.
Ex:
O
fuente
Abriste el archivo en modo binario:
El siguiente código arrojará un TypeError: se requiere un objeto de tipo bytes, no 'str'.
El siguiente código funcionará: debe usar la función decode ():
fuente
¿Por qué no intentas abrir tu archivo como texto?
Además, aquí hay un enlace para python 3.x en la página oficial: https://docs.python.org/3/library/io.html Y esta es la función abierta: https://docs.python.org/3 /library/functions.html#open
Si realmente está tratando de manejarlo como un binario, considere codificar su cadena.
fuente
Recibí este error cuando intentaba convertir un char (o cadena)
bytes
, el código era algo así con Python 2.7:Este es el camino de Python 2.7 cuando se trata de caracteres unicode.
Esto no funcionará con Python 3.6, ya que
bytes
requiere un argumento adicional para la codificación, pero esto puede ser un poco complicado, ya que una codificación diferente puede generar resultados diferentes:En mi caso tuve que usar
iso_8859_1
al codificar bytes para resolver el problema.Espero que esto ayude a alguien.
fuente