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

时间:2016-07-26 10:43:31

标签: python json file object typeconverter

我正在向Google Cloud Buckets发布视频,并且已签名的PUT网址可以解决问题。但是,如果文件大小超过10MB,它将无法工作,所以我找到了一个允许我这样做的开源,但它使用了像object这样的文件。

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的数据转换为像object这样的文件?

2 个答案:

答案 0 :(得分:4)

所谓的'类文件'在大多数情况下,object只是一个实现Python缓冲区接口的对象;也就是说,有writeseekio.StringIO等方法。

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

两个类都将类文件对象的数据作为第一个参数,所以你只需:

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

在此之后,f将是一个像文件一样工作的对象,除了它将数据保存在内存而不是磁盘上的事实。

答案 1 :(得分:1)

使用StringIO

data= StringIO(data)
read_in_chunks(data)