Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

698
Visualizações
TypeError: se requiere un objeto similar a bytes, no 'str' al escribir en un archivo en Python 3

Recientemente migré a Python 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:

TypeError: se requiere un objeto similar a bytes, no 'str'

El error está en la última línea (el código de búsqueda del patrón).

Intenté usar la función .decode() en cualquier lado de la declaración y también probé:

 if tmp.find('some-pattern') != -1: continue

- en vano.

Pude resolver casi todos los problemas de Python 2 a Python 3 rápidamente, pero esta pequeña declaración me estaba molestando.

over 4 years ago · Santiago Trujillo
9 Respostas
Responde à pergunta

0

Utilice la función encode() junto con el valor de cadena codificado de forma rígida que se proporciona entre comillas simples.

Ejemplo:

 file.write(answers[i] + '\n'.encode())

O

 line.split(' +++$+++ '.encode())
over 4 years ago · Santiago Trujillo Relatório

0

Recibí este error cuando intentaba convertir un carácter (o cadena) en bytes , el código era algo así con Python 2.7:

 # -*- coding: utf-8 -*- print(bytes('ò'))

Esta es la forma de Python 2.7 cuando se trata de caracteres Unicode.

Esto no funcionará con Python 3.6, ya que los bytes requieren un argumento adicional para la codificación, pero esto puede ser un poco complicado, ya que una codificación diferente puede generar resultados diferentes:

 print(bytes('ò', 'iso_8859_1')) # prints: b'\xf2' print(bytes('ò', 'utf-8')) # prints: b'\xc3\xb2'

En mi caso, tuve que usar iso_8859_1 al codificar bytes para resolver el problema.

over 4 years ago · Santiago Trujillo Relatório

0

Abrió 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

Tendría que usar un objeto de bytes para probar contra tmp en su lugar:

 if b'some-pattern' in tmp: continue

o abra el archivo como un archivo de texto reemplazando el modo 'rb' con 'r' .

over 4 years ago · Santiago Trujillo Relatório

0

Para este pequeño ejemplo, agregar la "b" antes de 'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n' resolvió mi problema:

 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()
over 4 years ago · Santiago Trujillo Relatório

0

Intente abrir su 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: io — Herramientas principales para trabajar con flujos .

Y esta es la función abierta: abrir

Si realmente está tratando de manejarlo como un binario, considere codificar su cadena.

over 4 years ago · Santiago Trujillo Relatório

0

Abrió 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')
over 4 years ago · Santiago Trujillo Relatório

0

Tienes que cambiar de wb a w:

 def __init__(self): self.myCsv = csv.writer(open('Item.csv', 'wb')) self.myCsv.writerow(['title', 'link'])

para

 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 puedes 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

over 4 years ago · Santiago Trujillo Relatório

0

Como ya se mencionó, está leyendo el archivo en modo binario y luego creando una lista de bytes. En su siguiente bucle for , está comparando cadenas con 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'>
over 4 years ago · Santiago Trujillo Relatório

0

Puede codificar su cadena usando .encode()

Ejemplo:

 'Hello World'.encode()

Como describe el error, para escribir una cadena en un archivo, primero debe codificarlo en un objeto similar a un byte, y encode() lo codifica en una cadena de bytes.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda