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

Boto3逐行从S3键读取文件内容

公羊伟志
2023-03-14

使用boto3,您可以从S3中的某个位置读取文件内容,给定一个bucket名称和密钥,如所示(这假设一个初步的导入boto3

s3 = boto3.resource('s3')

content = s3.Object(BUCKET_NAME, S3_KEY).get()['Body'].read()

这将返回一个字符串类型。我需要获取的特定文件恰好是一组类似字典的对象,每行一个。所以它不是JSON格式。我不想将其作为字符串读取,而是将其作为文件对象进行流式处理并逐行读取;除了先在本地下载该文件外,找不到其他方法来执行此操作

s3 = boto3.resource('s3')

bucket = s3.Bucket(BUCKET_NAME)

filename = 'my-file'
bucket.download_file(S3_KEY, filename)

f = open('my-file')

我想问的是,是否有可能在不必先在本地下载的情况下对文件进行这种类型的控制?

共有3个答案

竺绍辉
2023-03-14

这将完成以下工作:

bytes_to_read = 512

content = s3.Object(BUCKET_NAME, S3_KEY).get()['Body'].read(bytes_to_read)
韩寒
2023-03-14

kooshiwoosh对类似问题的以下评论提供了一个很好的答案:

from io import TextIOWrapper
from gzip import GzipFile
...

# get StreamingBody from botocore.response
response = s3.get_object(Bucket=bucket, Key=key)
# if gzipped
gzipped = GzipFile(None, 'rb', fileobj=response['Body'])
data = TextIOWrapper(gzipped)

for line in data:
    # process line
徐淳
2023-03-14

我发现.splitlines()对我有用。。。

txt_file = s3.Object(bucket, file).get()['Body'].read().decode('utf-8').splitlines()

如果没有.splitlines(),则返回整个文本块,尝试迭代每一行会导致迭代每个字符。使用.splitlines()可以实现逐行迭代。

在这里的示例中,我迭代每一行并将其编译成dict。

txt_file = s3.Object(bucket, file).get()['Body'].read().decode(
        'utf-8').splitlines()

for line in txt_file:
    arr = line.split()
    print(arr)
 类似资料:
  • 我通过执行以下操作读取S3存储桶中的文件名 现在,我需要获取文件的实际内容,类似于打开(filename).readlines()。最好的方法是什么?

  • 问题内容: 我在S3中有一个csv文件,我正在尝试读取标题行以获取大小(这些文件是由我们的用户创建的,因此它们几乎可以是任何大小)。有没有办法使用boto做到这一点?我以为也许我们可以使用python BufferedReader,但是我不知道如何从S3键打开流。任何建议都很好。谢谢! 问题答案: 看来boto具有可以执行此操作的功能。这是一些对我有用的代码: 调用会从对象返回下一个n个字节。 当

  • 问题内容: 我这样做是读取了S3存储桶中的文件名 现在,我需要获取文件的实际内容,类似于。什么是最好的方法? 问题答案: boto3提供了一种资源模型,该资源模型使诸如迭代对象之类的任务变得更加容易。不幸的是,StreamingBody不提供或。

  • 返回一个数组,数组中每个元素是指定文件中的每一行。 在 fs node 包中使用 readFileSync 函数指定文件中创建一个 Buffer 。使用 toString(encoding) 函数将 buffer 转换为字符串。通过逐行 split 文件内容(每个\n)根据文件内容创建一个数组。 const fs = require('fs'); const readFileLines = fil

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

  • 在我的项目中,我需要使用以下库(OMPL)。我特别感兴趣的是一个成员函数printAsMatrix(std::ofstream&out),它将数据输出到终端或文件。这里的函数是: 但我需要这些输出的值在其原始形式,作为双倍。因此,我想通过库阅读它们,使用我自己实现的以下函数: 由于函数只接受std::ifstream数据,我得到了很多编译错误。 所以我做了一个临时的变通办法: > 创建了新的变量: