2017-06-13 7 views
0

Google App Engineの標準アプリケーションでは、ファイルの作成は禁止されています。PyDrive on Google Appエンジン。 GoogleDriveオブジェクトのコンテンツをStringIOオブジェクトから設定できません

でも一時ファイルた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()) 

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

エラーを回避するには、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はユニコードを入力として受け入れるだけなので、io.StringIOを使用すると、コード内のユニコードとバイトコードの区別がより明確になります。

関連する問題