0

Google App Engine 标准应用程序中禁止创建文件。

甚至tempfile也被禁用,除了别名为StringIO的TemporaryFile。所以我需要用 StringIO 对象设置驱动文件的内容。

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

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

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

我的代码

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

有没有办法可以GoogleDriveStringIO对象设置对象的内容?

4

2 回答 2

2

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

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

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

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

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

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

>>> s = u'ŋđŧ¶eŋŧ¶ß¶ŋŧ¶'.encode('utf-8')
>>> sio = StringIO(s.decode('utf-8'))
>>> io.BytesIO(sio.getvalue().encode('utf-8'))
<_io.BytesIO object at 0x7f36c0dc0bf0>

Python2StringIO.StringIO接受 unicode 或 bytestrings 作为输入,在这种情况下可能会导致混淆。io.StringIO只会接受 unicode 作为输入,因此 usingio.StringIO可能有助于在代码中更清晰地区分 unicode 和字节串。

于 2017-06-14T05:05:21.897 回答
2

我在 GitHub 上得到了答案。

它没有记录,但您可以直接设置 GoogleDrive 对象的内容

drive = GoogleDrive(get_drive_auth())
drive_file = drive.CreateFile()
drive_file.content = stringio_object
于 2017-06-16T12:47:05.013 回答