简体   繁体   中英

Python 3.5 BytesIO error

I am making a project all in python 2.7 but it started to give some errors to me on the final parts since the documentation is in python 3.5. So i am changing everything to python 3.5, but it is giving me a error because of bytesIO. Can you help me to understand why, and what should i do? The error is coming from def repr on string_dinamica.write('P3\\n'). I left all the code in case that it´s needed. Thanks for the help. NOTE: Just to confirm this works on python 2.7 but not in 3.5

from io import BytesIO
from cor_rgb_42347 import CorRGB

class Imagem:
    def __init__(self, numero_linhas, numero_colunas):
        self.numero_linhas = numero_linhas
        self.numero_colunas = numero_colunas
        self.linhas = []
        for n in range(numero_linhas):
            linha = []
            for m in range(numero_colunas):
                linha.append(CorRGB(0.0, 0.0, 0.0))
            self.linhas.append(linha)

    def __repr__(self):
        string_dinamica = BytesIO()

        string_dinamica.write('P3\n')
        string_dinamica.write("#mcg@leim@isel 2015/16\n")
        string_dinamica.write(str(self.numero_colunas) + " " \
                              + str(self.numero_linhas) + "\n")
        string_dinamica.write("255\n")
        for linha in range(self.numero_linhas):
            for coluna in range(self.numero_colunas):
                string_dinamica.write(str(self.linhas[linha][coluna])+ " ")
            string_dinamica.write("\n")

        resultado = string_dinamica.getvalue()

        string_dinamica.close()

        return resultado


    def set_cor(self, linha, coluna, cor_rgb):
        """Permite especificar a cor RGB do pixel na linha "linha",
        coluna "coluna".
        """
        self.linhas[linha-1][coluna-1] = cor_rgb

    def get_cor(self, linha, coluna):
        """Permite obter a cor RGB do pixel na linha "linha",
        coluna "coluna".
        """
        return self.linhas[linha-1][coluna-1]

    def guardar_como_ppm(self, nome_ficheiro):

        """Permite guardar a imagem em formato PPM ASCII num ficheiro.
        """
        ficheiro = open(nome_ficheiro, 'w')
        ficheiro.write(str(self))
        ficheiro.close()



if __name__ == "__main__":
    imagem1 = Imagem(5,5)
    print(imagem1)




 Traceback (most recent call last):
  File "C:\Users\Utilizador\Desktop\Projectos Finais\Projecto_42347\imagem_42347.py", line 60, in <module>
    print(imagem1)
  File "C:\Users\Utilizador\Desktop\Projectos Finais\Projecto_42347\imagem_42347.py", line 19, in __repr__
    string_dinamica.write('P3\n')
TypeError: a bytes-like object is required, not 'str'

For Python 3, just change BytesIO to StringIO . Python 3 strings are Unicode strings instead of byte strings, and __repr__ should return a Unicode string in Python 3.

If you try to return a bytes object like some other answers suggest, you will get:

TypeError: __repr__ returned non-string (type bytes)

As I mentioned on my comment, BytesIO requires byte-like object .

Demo:

>>> from io import BytesIO
>>> 
>>> b = BytesIO()
>>> 
>>> b.write('TEST\n')
Traceback (most recent call last):
  File "<pyshell#97>", line 1, in <module>
    b.write('TEST\n')
TypeError: 'str' does not support the buffer interface
>>> 
>>> 
>>> b.write(b'TEST\n')
5
>>> v = b.getbuffer()
>>> 
>>> v[2:4]=b'56'
>>> 
>>> b.getvalue()
b'TE56\n'

So add to the beginning of your the param. in you pass to write method, b(for binary).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM