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 の場合は、 に変更BytesIOするだけStringIOです。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 に答える