当前位置: 首页 > 知识库问答 >
问题:

用boto3从S3桶读取文件内容

糜博远
2023-03-14

我通过执行以下操作读取S3存储桶中的文件名

objs = boto3.client.list_objects(Bucket='my_bucket')
    while 'Contents' in objs.keys():
        objs_contents = objs['Contents']
        for i in range(len(objs_contents)):
            filename = objs_contents[i]['Key']

现在,我需要获取文件的实际内容,类似于打开(filename).readlines()。最好的方法是什么?

共有3个答案

傅博容
2023-03-14

使用客户端而不是资源:

s3 = boto3.client('s3')
bucket='bucket_name'
result = s3.list_objects(Bucket = bucket, Prefix='/something/')
for o in result.get('Contents'):
    data = s3.get_object(Bucket=bucket, Key=o.get('Key'))
    contents = data['Body'].read()
    print(contents.decode("utf-8"))
龙令雪
2023-03-14

您还可以考虑smart_open模块,它支持迭代器

from smart_open import smart_open

# stream lines from an S3 object
for line in smart_open('s3://mybucket/mykey.txt', 'rb'):
    print(line.decode('utf8'))

和上下文管理器:

with smart_open('s3://mybucket/mykey.txt', 'rb') as s3_source:
    for line in s3_source:
         print(line.decode('utf8'))

    s3_source.seek(0)  # seek to the beginning
    b1000 = s3_source.read(1000)  # read 1000 bytes

在以下位置查找smart\u openhttps://pypi.org/project/smart_open/

常心水
2023-03-14

BOTO3提供了一个资源模型,使得像迭代对象这样的任务更加容易。不幸的是,StreamingBody不提供readline或readline。

s3 = boto3.resource('s3')
bucket = s3.Bucket('test-bucket')
# Iterates through all the objects, doing the pagination for you. Each obj
# is an ObjectSummary, so it doesn't contain the body. You'll need to call
# get to get the whole body.
for obj in bucket.objects.all():
    key = obj.key
    body = obj.get()['Body'].read()
 类似资料:
  • 问题内容: 我这样做是读取了S3存储桶中的文件名 现在,我需要获取文件的实际内容,类似于。什么是最好的方法? 问题答案: boto3提供了一种资源模型,该资源模型使诸如迭代对象之类的任务变得更加容易。不幸的是,StreamingBody不提供或。

  • 使用boto3,您可以从S3中的某个位置读取文件内容,给定一个bucket名称和密钥,如所示(这假设一个初步的) 这将返回一个字符串类型。我需要获取的特定文件恰好是一组类似字典的对象,每行一个。所以它不是JSON格式。我不想将其作为字符串读取,而是将其作为文件对象进行流式处理并逐行读取;除了先在本地下载该文件外,找不到其他方法来执行此操作 我想问的是,是否有可能在不必先在本地下载的情况下对文件进行

  • 使用Boto3,python脚本从S3桶中下载文件以读取它们,并将下载文件的内容写入名为的文件。 我的问题是,一旦脚本使用AWS Lambda函数,它将如何以相同的方式工作?

  • 我刚接触骆驼,需要一些指导。我需要从S3存储桶中读取一些文件。结构是这样的。 当一个特定的excel文件被放入传入的/xls文件夹(比如file1.xls)时,我需要拾取所有文件,进行一些处理并将它们放入具有相同目录结构的已处理文件夹中。 我需要使用什么组件?我试着阅读留档,但有点难以弄清楚我需要什么组件。我知道我会使用camel-aws-s3插件,但那里没有很多例子。

  • 我想读一本书的内容。存储在s3存储桶中的txt文件。 我试过: 但是我得到的s3file对象不包含文件的内容。 你知道该怎么做吗?

  • 我正在尝试使用读取aws s3存储桶中的文件 我已经能够使用节点aws-sdk下载和上传文件,但是我不知道如何简单地读取它并解析内容。 下面是我如何从s3读取文件的示例: