boto3 S3 对象解析

Posted

技术标签:

【中文标题】boto3 S3 对象解析【英文标题】:boto3 S3 Object Parsing 【发布时间】:2018-02-26 22:04:02 【问题描述】:

我正在尝试编写一个 Python 脚本来处理存储在 S3 上的音频数据。

我有一个正在调用的 S3 对象

def grabAudio(filename, directory):

     obj = s3client.get_object(Bucket=bucketname, Key=directory+'/'+filename)

return obj['Body'].read()

访问数据使用

print(obj['Body'].read())

产生正确的音频信息。所以它从存储桶中访问数据就好了。

当我尝试在我的音频处理库 (pydub) 中使用这些数据时,它失败了:

audio = Audiosegment.from_wav(grabAudio(filename, bucketname))

Traceback (most recent call last): File "split_audio.py", line 38, in <module> audio = AudioSegment.from_wav(grabAudio(filename, bucketname)) File "C:\Users\jmk_m\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pydub\audio_segment.py", line 544, in from_wav return cls.from_file(file, 'wav', parameters) File "C:\Users\jmk_m\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pydub\audio_segment.py", line 456, in from_file file.seek(0) AttributeError: 'bytes' object has no attribute 'seek'

从 s3 进来的对象的格式是什么?我猜是字节数组?如果是这样,有没有办法将其解析为 .wav 格式而无需保存到磁盘?我正在尝试避免保存到磁盘。

也对其他音频处理库开放。

【问题讨论】:

您可以使用io.BytesIObytes 创建一个类似文件的对象并将其传递给您的库:***.com/a/44437265/200603 【参考方案1】:

感谢 Linas 链接了一个类似的问题,感谢 Jiaaro 的回答。

 import io
    s = io.BytesIO(y['data'])
    AudioSegment.from_file(s).export(x, format='mp3')

允许我直接从桶中拉到内存中

obj = s3client.get_object(Bucket=bucketname, Key=customername+'/'+filename)

data = io.BytesIO(obj['Body'].read())
audio = AudioSegment.from_file(data)

【讨论】:

以上是关于boto3 S3 对象解析的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 boto3 将 S3 对象保存到文件中

如何使用 boto3 将文件或数据写入 S3 对象

python Python3 / boto3多线程S3对象删除

带有boto3的emr上的pyspark,带有Futures的s3对象结果的副本在[100000毫秒]后超时

使用boto3批量上传图片到S3

aws s3 ls 的 boto3 等价物是啥?