2016-07-26 96 views
0

我正在向Google Cloud存儲桶發佈視頻,並且有一個簽名的PUT url會訣竅。但是,如果文件大小大於10MB,它將無法工作,所以我找到了一個開放源代碼,可以讓我做到這一點,但它使用像對象一樣的文件。將str數據轉換爲Python中的文件對象

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)。這工作無縫。

如何將這些數據轉換爲像對象那樣的文件作爲str的數據?

回答

2

所謂的「類文件」對象是在大多數情況下只實現了Python緩衝接口的對象;即具有如read,write,seek等的方法。

緩衝接口工具的標準庫模塊稱爲io。您正在尋找io.StringIO或​​,具體取決於您擁有的數據類型 - 如果它是Unicode編碼字符串,則應該使用io.StringIO,但您可能正在使用原始字節流(例如在圖像中文件),而不僅僅是文本,所以io.BytesIO是你在找什麼。使用文件時,這與爲unicode文件執行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用戶獨家發現,所以重要的是要注意其中一個答案與兩個版本兼容,而另一個則不兼容。 – Underyx

相關問題