【问题标题】:aws lambda read line by line and write to fileaws lambda 逐行读取并写入文件
【发布时间】:2018-12-14 16:12:56
【问题描述】:

如何使用 AWS lambda 和 python 将文件处理步骤的结果写回文件? 我正在从 S3 读取一个文件并在每一行中寻找一个特殊的表达方式。如果包含此表达式,我将操作该行。由于 lambda 无法写入文件(或 S3 不允许这样做),如何收集行转换的结果并将所有转换的行写入文件? 代码如下所示:

import boto3
import botocore

s3 = boto3.resource('s3')
s3 = boto3.client('s3')

def lambda_handler(event, context):

bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']

obj = s3.get_object(Bucket=bucket, Key=key)

for line in obj['Body'].read().decode('utf-8').splitlines():
    if 'PCSI' in line:
        newLine = line \
        .replace('E','') \
        .replace('--','') \
        .replace('<',';') \
        .replace('>','') \
        .replace('9_PCSI','') \
        .replace('[','') \
        .replace('|',';') \
        .replace(']',';') \
        .replace(' ','')

当我打印结果时,它工作正常,并为我提供了我想要的每一行的格式。

我的一个想法是写入 lambda 的 /tmp 文件夹中的文件:

newFile = open('/tmp/pcsi.txt','a')

并修改代码

...
if 'PCSI' in line:
    newFile.write(line \
    .replace(.....

但我不知道这是否有效,因为我无法“看到”/tmp 中的文件。我也很难将它再次下载到 S3。有没有办法将每一行写入文件并将其存储到 S3?

【问题讨论】:

  • Lambda 能够写入 S3 存储桶,您只需使用 boto3 并进行适当的 IAM 设置。
  • 另一种方法是简单地将文件下载/tmp。然后你可以像普通文件一样阅读它并做任何你想做的事情。如果您希望将修改后的文件保存回 S3,只需写入本地文件,然后将其上传到 S3。
  • 下载将无法正常运行,一切都应在 AWS 中运行,无需本地 PC

标签: python amazon-web-services amazon-s3 aws-lambda readlines


【解决方案1】:

你已经成功了一半。您已从 s3 读取对象并根据您的要求对其进行操作。现在,您必须将其写入 s3,以便您在 lambda 函数中所做的修改反映在 s3 中。

这可以通过

来完成

在这里,使用 put_object 看起来像

client.put_object(Body=manipulated_object, Bucket=bucket, Key=key)

【讨论】:

  • 说明很清楚 - 谢谢。我很难将所有操作的行写入文件,因为原始文件中有几个带有“PCSI”表达式的行。据我了解,Lambda 和 S§ 不允许附加案例。使用 put 选项,我可以将最后操作的行写入 S3,但不是全部?!因此,我想在追加情况下将数据写入 lambda 的 /tmp,然后将这个新文件写入 S3,但到目前为止没有成功(或者还有其他方法吗?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多