2017-06-13 70 views
0

文件創建設定Google雲端硬盤對象的內容在谷歌應用程序引擎的標準應用是被禁止的。PyDrive在Google App引擎上。無法從StringIO對象

即使臨時文件被禁用,除了TemporaryFile其上面重疊到StringIO的。所以我需要用一個StringIO對象來設置驅動器文件的內容。

我發現的唯一合適的方法是SetContentString()

但方法需要另外一種UTF-8字符串,我得到一個解碼異常 -

UnicodeDecodeError錯誤:「ASCII」編解碼器不能在位置0解碼字節0x89上:順序不在範圍內(128)

我的代碼

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

有沒有一種方法,我可以從StringIO對象設置GoogleDrive對象的內容?

回答

0

我在GitHub上得到了答案。

它沒有記錄,但您可以設置Google雲端硬盤對象直接

drive = GoogleDrive(get_drive_auth()) 
drive_file = drive.CreateFile() 
drive_file.content = stringio_object 
內容
1

PyDrive的GoogleDriveFile.setContentString方法期望接收一個unicode字符串作爲參數,以及一個可選的編碼 - 默認值是UTF-8。

的方法編碼Unicode字符串,並使用編碼字符串初始化一個io.BytesIO情況下,像這樣:

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

你用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

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

Python2的StringIO.StringIO接受Unicode或字節串作爲輸入,這會引起混亂這樣的情況下。 io.StringIO將只接受unicode作爲輸入,所以使用io.StringIO可能有助於在代碼中保持unicode和bytestrings之間的區別更清晰。