from convertir bytes binario python string python-3.x byte

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.



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