使用谷歌云存储将数据从gcs传输到s3

我正在制作一个小应用程序,将数据从BigQuery导出到google-cloud-storage,然后将其复制到aws s3中,但无法找到如何在python中执行此操作。

我已经写了kotlin的代码(因为这对我来说是最简单的,我的问题范围之外的原因,我们希望它运行在python),在google sdk允许我从Blob对象得到一个InputSteam ,然后我可以注入到amazon s3 sdk's AmazonS3.putObject(String bucketName, String key, InputStream input, ObjectMetadata metadata)

python sdk似乎我只有选择下载文件到一个文件和一个字符串。

我想(就像我在kotlin中那样)将Blob对象返回的一些对象传递给AmazonS3.putObject()方法,而不必先将内容保存为文件。

我不是一个Python专家,所以我可能已经错过了一个明显的方式做到这一点。

我结束了以下解决方案,显然download_to_filename将数据下载到boto3 s3 client可以处理的文件类对象中。

这对于较小的文件来说工作得很好,但是由于它将所有内容都缓存在内存中,所以对于较大的文件可能会有问题。

 def copy_data_from_gcs_to_s3(gcs_bucket, gcs_filename, s3_bucket, s3_filename): gcs_client = storage.Client(project="my-project") bucket = gcs_client.get_bucket(gcs_bucket) blob = bucket.blob(gcs_filename) data = BytesIO() blob.download_to_file(data) data.seek(0) s3 = boto3.client("s3") s3.upload_fileobj(data, s3_bucket, s3_filename) 

如果任何人有关于BytesIO之外的信息/知识来处理数据(fx。所以我可以直接将数据流到s3中,而不必将其缓存在主机上的内存中),这将是非常值得赞赏的。