谷歌应用引擎上的PyDrive。无法从StringIO对象设置GoogleDrive对象的内容

2024-09-29 01:28:13 发布

您现在位置:Python中文网/ 问答频道 /正文

谷歌应用引擎标准应用程序禁止创建文件。在

即使tempfile也被禁用,除了临时文件,其别名为StringIO。所以我需要用StringIO对象设置驱动器文件的内容。在

我找到的唯一合适的方法是SetContentString()。在

但是该方法需要一个utf-8字符串,我得到一个decode异常-

UnicodeDecodeError:“ascii”编解码器无法解码位置0的字节0x89:序号不在范围(128)

我的代码

drive = GoogleDrive(get_drive_auth())
drive_file = drive.CreateFile()
drive_file.SetContentString(stringio_object.getvalue())

有没有办法可以从StringIO对象设置GoogleDrive对象的内容?在


Tags: 文件对象方法引擎应用程序内容标准drive
2条回答

我在GitHub上得到了答案。在

它没有文档化,但您可以直接设置GoogleDrive对象的内容

drive = GoogleDrive(get_drive_auth())
drive_file = drive.CreateFile()
drive_file.content = stringio_object

PyDrive的GoogleDriveFile.setContentString方法期望接收一个unicode字符串作为参数,以及一个可选的编码-默认值是UTF-8。在

该方法对unicode字符串进行编码,并使用编码的字符串初始化io.BytesIO实例,如下所示:

content = io.BytesIO(input_string.encode('utf-8'))

您正在使用testring编码的UTF-8初始化您的StringIO实例,这将导致错误:

>>> s = u'ŋđŧ¶eŋŧ¶ß¶ŋŧ¶'.encode('utf-8')                                                                                                              
>>> sio = StringIO(s)                                                                                                                                 
>>> io.BytesIO(sio.getvalue().encode('utf-8'))                                                                                                
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128)

为了避免错误,请使用unicode字符串初始化StringIO。在

^{pr2}$

Python2的StringIO.StringIO接受unicode或bytestrings作为输入,在这种情况下可能会导致混淆。io.StringIO将只接受unicode作为输入,因此使用io.StringIO可能有助于在代码中更清楚地区分unicode和bytestrings。在

相关问题 更多 >