1

我在 python 2.7 中制作了一个项目,但由于文档位于 python 3.5 中,因此它开始在最后部分给我一些错误。所以我将所有内容都更改为 python 3.5,但由于 bytesIO,它给了我一个错误。你能帮我理解为什么,我应该怎么做?错误来自string_dinamica.write('P3\n') 上的 def repr 。我留下了所有代码以备不时之需。谢谢您的帮助。注意:只是为了确认这适用于 python 2.7 但不适用于 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'
4

2 回答 2

2

对于 Python 3,只需更改BytesIOStringIO. Python 3 字符串是 Unicode 字符串而不是字节字符串,__repr__在 Python 3 中应该返回一个 Unicode 字符串。

如果您尝试像其他一些答案所建议的那样返回一个字节对象,您将得到:

TypeError: __repr__ returned non-string (type bytes)
于 2016-07-04T04:40:01.960 回答
0

正如我在评论中提到的,BytesIO需要byte-like object.

演示:

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

所以添加到你的参数的开头。在你传递给write方法 b(对于二进制)。

于 2016-07-04T04:39:16.947 回答