2016-07-26 2 views
0

私はGoogle Cloud Bucketに動画を投稿しています。署名されたPUT urlはそのトリックを行います。しかし、ファイルサイズが10MBを超えると動作しませんので、私はこれを行うことができるオープンソースを見つけましたが、オブジェクトのようなファイルを使用します。Pythonでstrデータをファイルオブジェクトに変換する

def read_in_chunks(file_object, chunk_size=65536): 
while True: 
    data = file_object.read(chunk_size) 
    if not data: 
     break 
    yield data 

def main(file, url): 
content_name = str(file) 
content_path = os.path.abspath(file) 
content_size = os.stat(content_path).st_size 

print content_name, content_path, content_size 

f = open(content_path) 

index = 0 
offset = 0 
headers = {} 

for chunk in read_in_chunks(f): 
    offset = index + len(chunk) 
    headers['Content-Type'] = 'application/octet-stream' 
    headers['Content-length'] = content_size 
    headers['Content-Range'] = 'bytes %s-%s/%s' % (index, offset, content_size) 
    index = offset 
    try: 
     r = requests.put(url, data=chunk, headers=headers) 
     print "r: %s, Content-Range: %s" % (r, headers['Content-Range']) 
    except Exception, e: 
     print e 

私がビデオをアップロードする方法は、json形式のデータを渡すことでした。

class GetData(webapp2.RequestHandler): 
def post(self): 
    data = self.request.get('file') 

私がしたのは、すべてrequest.put(url、data = data)でした。これはシームレスに機能しました。

このデータを変換するには、Pythonはstrとしてオブジェクトのようなファイルに認識されますか?

答えて

2

いわゆる「ファイルのような」オブジェクトは、ほとんどの場合、Pythonのバッファインタフェースを実装するだけのオブジェクトです。つまり、read,write,seekなどのメソッドがあります。

バッファインターフェイスツールの標準ライブラリモジュールは、ioと呼ばれています。あなたは、あなたが持っているデータのタイプに応じて、io.StringIOか​​のいずれかを探しています - ユニコードでエンコードされた文字列の場合はio.StringIOを使用するはずですが、生のバイトストリームで作業している可能性がありますファイル)を使用するので、io.BytesIOはあなたが探しているものです。ファイルを操作する場合、ユニコードファイルの場合はopen(path, 'r')、バイトの生の処理の場合はopen(path, 'rb')と同じ区別があります。

両方のクラスは、最初のパラメータとしてファイルライクオブジェクトのデータを取るので、あなただけの操作を行います。

f = io.BytesIO(b'test data') 

この後、fはを除いて、単にファイルと同じように動作対象となりますディスク上ではなくメモリ上のデータを保持しているという事実です。

+0

ありがとう、これは解決策でした。今私は400レスポンスを得た理由を理解しなければなりません。しかし、ありがとう、これは私が探していたものです。 –

1

使用StringIO

data= StringIO(data) 
read_in_chunks(data) 
+1

この解決策はPython 3では動作しません。代わりに 'io'モジュールを使用する必要があります。詳細は私の答えを見てください。 – Underyx

+0

@Underyx ... OPは代わりにPython2で動作しているようです! –

+1

@IronFistはい、それは残念です。どちらの方法でも、この質問はおそらくPython 2ユーザーのみが見つけることはできないので、答えの1つは両方のバージョンと互換性があり、もう1つはそうではないことに注意することが重要です。 – Underyx

関連する問題