在Python中将str数据转换为文件对象



我正在将视频发布到Google Cloud Buckets,一个签名的PUT url就可以了。然而,如果文件大小大于10MB,它将不起作用,所以我找到了一个开放源代码,允许我这样做。然而,它使用了一个类似文件的对象。

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的数据转换为类似文件的对象?

所谓的"类文件"对象在大多数情况下只是实现Python缓冲区接口的对象;即具有readwriteseek等方法

缓冲区接口工具的标准库模块称为io。您要查找的是io.StringIOio.BytesIO,这取决于您所拥有的数据类型——如果它是unicode编码的字符串,则应该使用io.StringIO,但您可能使用的是原始字节流(例如图像文件中的字节流),而不是仅使用文本,因此io.BytesIO就是您要找的。在处理文件时,这与对unicode文件执行open(path, 'r')和对字节的原始处理执行open(path, 'rb')的区别相同。

这两个类都将类文件对象的数据作为第一个参数,所以您只需执行以下操作:

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

在此之后,f将成为一个与文件一样工作的对象,只是它将数据保存在内存中,而不是磁盘上。

使用StringIO:

data= StringIO(data)
read_in_chunks(data)

相关内容

  • 没有找到相关文章

最新更新