es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El objeto ‘str’ no tiene el atributo ‘decode’ en Python 3.

import sys

script, error = sys.argv

def main(language_file, errors):
    line = language_file.readline()

    if line:
        print_line(line, errors)
        return main(language_file, errors)

def print_line(line, errors):
    raw_bytes = line.strip()
    cooked_string = raw_bytes.decode(errors=errors)
    print(raw_bytes, "<==>", cooked_string)

languages = open("languages2.txt")

main(languages, error)

Si ejecuto esto, obtengo ‘str’ object has no attribute ‘decode’.

El archivo ‘languages2.txt’ solo contiene bytes que quiero decodificar.

Si intento ‘raw_bytes.encode(errors=errors)’ el programa se ejecuta pero obviamente imprime solo los bytes 2 veces.

Soy nuevo en esto, así que disculpa por la pregunta tonta.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que decode() es un método para objetos de tipo byte en Python 2, pero en Python 3 los objetos de tipo byte tienen un método decode() que se puede utilizar para decodificar los bytes a una cadena de caracteres.

    En este código, la variable raw_bytes es un objeto de tipo byte y por lo tanto tiene un método decode(), pero el mensaje de error sugiere que en realidad la variable es una cadena de caracteres. Esto es probablemente porque el método readline() está devolviendo una cadena de caracteres en lugar de un objeto de tipo byte.

    Para solucionar el problema, puedes modificar la función main() para leer el archivo en modo binario (rb) y devolver objetos de tipo byte en lugar de cadenas de caracteres. También puedes utilizar el método encode() para convertir los objetos de tipo byte en cadenas de caracteres para imprimir:

    def main(language_file, errors):
        line = language_file.readline()
    
        if line:
            print_line(line, errors)
            return main(language_file, errors)
    
    
    def print_line(line, errors):
        raw_bytes = line.strip()
        cooked_string = raw_bytes.decode(errors=errors)
        print(raw_bytes, '<===>', cooked_string.encode())
    
    languages = open("languages2.txt", 'rb')
    
    main(languages, error)
    

    En esta versión del código, open("languages2.txt", 'rb') abre el archivo en modo binario para que readline() devuelva objetos de tipo byte en lugar de cadenas de caracteres. La instrucción print() ahora llama a cooked_string.encode() para convertir la cadena de caracteres decodificada de nuevo en bytes para imprimir.

Comments are closed.