convertir - TypeError: se requiere un objeto similar a bytes, no ''str'' cuando se escribe en un archivo en Python3
decode byte to string (8)
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 función
.decode()
a ambos lados 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.
¿Por qué no intentas abrir tu archivo como texto?
with open(fname, ''rt'') as f:
lines = [x.strip() for x in f.readlines()]
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.
Abriste el archivo en modo binario:
El siguiente código arrojará un TypeError: se requiere un objeto similar a bytes, no ''str''.
for line in lines:
print(type(line))# <class ''bytes''>
if ''substring'' in line:
print(''success'')
El siguiente código funcionará: debe usar la función decode ():
for line in lines:
line = line.decode()
print(type(line))# <class ''str''>
if ''substring'' in line:
print(''success'')
Abriste 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 de
bytes
, no como
str
.
Entonces no puede usar una cadena en una prueba de contención:
if ''some-pattern'' in tmp: continue
En su lugar, debería usar un objeto de
bytes
para probar contra
tmp
:
if b''some-pattern'' in tmp: continue
o abra el archivo como un archivo de texto reemplazando el modo
''rb''
con
''r''
.
Como ya se mencionó, está leyendo el archivo en modo binario y luego está creando una lista de bytes. En su siguiente bucle for , 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:
with open(fname, ''rb'') as f:
lines = [x.decode(''utf8'').strip() for x in f.readlines()]
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:
>>> s=bytes(''hello'')
>>> type(s)
<type ''str''>
Puede codificar su cadena usando
.encode()
Ejemplo:
''Hello World''.encode()
Tienes que cambiar de wb a w:
def __init__(self):
self.myCsv = csv.writer(open(''Item.csv'', ''wb''))
self.myCsv.writerow([''title'', ''link''])
a
def __init__(self):
self.myCsv = csv.writer(open(''Item.csv'', ''w''))
self.myCsv.writerow([''title'', ''link''])
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
Use la función encode () junto con el valor String codificado en una comilla simple.
Ex:
file.write(answers[i] + ''/n''.encode())
O
line.split('' +++$+++ ''.encode())
para este pequeño ejemplo: zócalo de importación
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()
agregar la "b" antes de ''GET http://www.py4inf.com/code/romeo.txt HTTP / 1.0 / n / n'' resolvió mi problema