根据https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.upload_file和https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.upload_fileobj,upload_fileobj可能听起来更快.但有人知道具体细节吗?我应该只上传文件,还是应该以二进制模式打开文件以使用upload_fileobj?换一种说法,
import boto3
s3 = boto3.resource('s3')
### Version 1
s3.meta.client.upload_file('/tmp/hello.txt', 'mybucket', 'hello.txt')
### Version 2
with open('/tmp/hello.txt', 'rb') as data:
s3.upload_fileobj(data, 'mybucket', 'hello.txt')
版本1还是版本2更好?有区别吗?
解决方法:
upload_fileobj的要点是文件对象首先不必存储在本地磁盘上,但可以表示为RAM中的文件对象.
为此目的,Python有standard library module.
代码看起来像
import io
fo = io.BytesIO(b'my data stored as file object in RAM')
s3.upload_fileobj(fo, 'mybucket', 'hello.txt')
在这种情况下,它将执行得更快,因为您不必从本地磁盘读取.