write()参数必须为str,而不是字节数python

时间:2018-09-28 14:09:14

标签: python api

我是python的新手。我得到了这个预先编写的代码,可以下载数据以进行报告。但是我得到了错误

  

“ write()参数必须是str,而不是字节”。

请参见下面的代码

def _download_report(service, response, ostream):

    logger.info('Downloading keyword report')
    written_header = False
    for fragment in range(len(response.files)):
      file_request = service.reports().getFile(
        reportId=response.id_, reportFragment=fragment)
      istream = io.BytesIO(file_request.execute())

    if written_header:
      istream.readline()
    else:
      written_header = True
    ostream.write(istream.read())

3 个答案:

答案 0 :(得分:1)

您需要将最后一行更改为

ostream.write(istream.read().decode('utf-8'))

PS。您可能需要用数据中的任何编码替换`'utf-8'

答案 1 :(得分:0)

要详细说明@sgDysregulation的答案:

python 3的一个独特之处是字符串('hello, world')和二进制字符串(b'hello, world')基本不兼容。例如,如果您熟悉基本文件I / O,则有两种类型的读取文件的模式-您可以使用open('file.txt', 'r'),当您从文件中读取文件时,它会返回unicode字符串。 {1}},它返回二进制字符串。写入同样如此-您不能在模式open('file,txt', 'rb')下正确写入字符串,也不能在模式'wb'下写入二进制字符串。

在这种情况下,您的'w'在读取时返回二进制字符串,而您的istream希望写一个unicode字符串。解决方案是将编码从一种更改为另一种,并执行sgDysregulation建议的操作:

ostream

这假定二进制字符串可能是utf-8格式编码的。否则,您可能必须使用其他格式。

答案 2 :(得分:0)

您必须对BytesIO对象进行解码才能获得可以写入文件的字符串:

ostream.write(istream.read().decode('utf-8'))