我是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())
答案 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'))