使用Python访问AWS S3

最近在使用Python访问S3,进行文件的上传和下载。因为都是私有数据,所以不能直接通过Web进行下载。AWS提供了一个Python库boto3,来完成相关的操作。但是其文档写得相当差,没有详细的tutorial和examples。自己做了一些google搜索,结合boto3文档,对一些常用操作进行说明。

boto3使用当前最新版本1.4.6。

AWS配置

访问S3需要aws_access_key_id和aws_secret_access_key。在boto3提供的API中,可以指定这两个值。但是把安全相关的这些信息放到代码中并不是一个好的选择。所以,我们通过awscli配置,将其存放到~/.aws/credentials。boto3的API在访问S3时,会自动从该文件中读取相关信息。

awscli可以通过pip install awscli进行安装。

下载文件

下载文件需要提供bucket名和文件名。

可以直接下载并保存到本地文件中:

bucket_name = 'mybucket'
file_name = 'hello.txt'
local_file_name = '/tmp/hello.txt'
s3 = boto3.resource('s3')
s3.Object(bucket_name, file_name).download_file(local_file_name)

也可以下载file object,保存到buffer中,以避免不必要的文件读写。

buf = io.BytesIO()
s3 = boto3.resource('s3')
s3.Object(bucket_name, file_name).download_fileobj(buf)

如果想把S3作为一个read stream,可以使用Object的get() method:

s3 = boto3.resource('s3')
obj = s3.Object(bucket_name, file_name)
chunk_size = 64*1024
stream = obj.get().get('Body')
while True:
        data = stream.read(chunk_size)
        if not len(data):
           raise StopIteration
        yield data

上传文件

上传文件可以同样可以有三种方式。

使用upload_file:

s3 = boto3.resource('s3')
s3.Object(bucket_name, file_name).upload_file(local_file)

使用upload_fileobj:

s3 = boto3.resource('s3')
with open(local_file, 'rb') as f:
    s3.Object(bucket_name, file_name).upload_fileobj(f)

使用put() method:

s3 = boto3.resource('s3')
with open(local_file, 'rb') as f:
    s3.Object(bucket_name, file_name).put(Body=f)

检测文件是否存在

有的时候我们需要检测文件是否在S3中已经存在,以避免不必要的误操作。可以使用如下代码。根据这篇文章Fastest way to find out if a file exists in S3 ,如果对大量文件进行操作的话,性能应该不错。

s3 = boto3.resource('s3')
bucket = s3.Bucket(bucket_name)
for obj in bucket.objects.filter(Prefix=file_name):
    if obj.key == file_name:
        return True
 return False

你可能感兴趣的:(使用Python访问AWS S3)