我正在尝试使用python lambda函数在存储在S3中的对象上追加一个文本文件,并在其中添加一个新行。由于存储在S3中的对象是不可变的,因此您必须首先将该文件下载到“/tmp/”中,然后修改它,然后将新版本上载回S3。我的代码会追加数据,但不会追加新行。
BUCKET_NAME = 'mybucket'
KEY = 'test.txt'
s3 = boto3.resource('s3')
def lambda_handler(event, context):
try:
s3.Object(BUCKET_NAME, KEY).download_file('/tmp/test.txt')
except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == "404":
print("The object does not exist.")
else:
raise
with open('/tmp/test.txt', 'a') as fd:
fd.write("this is a new string\n")
s3.meta.client.upload_file('/tmp/test.txt', BUCKET_NAME, KEY)
文件总是附加新的字符串,但从来没有一个新的行。
更新:这个问题不会发生在Linux机器或Mac上。Lambda函数运行在Linux容器上,这意味着/tmp/中的文件保存为Unix的文本文件。一些Windows应用程序不会在Unix的文本文件上显示换行符,这是这里的情况。
3条答案
按热度按时间2wnc66cl1#
您需要指定本地文件路径
Boto3文档参考:http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Bucket.download_file
xfb7svmp2#
不错的帖子!只是一个调整。您应该更改download_file方法的参数中LOCAL_FILE和KEY的顺序。正确的语法是:
此外,如果我们在桶中找不到文件的情况下删除本地文件也会很好。因为如果我们不删除本地文件(如果明显存在),我们可能会在已经存在的本地文件中添加一个新行。
以“try”开头的最终代码可能如下所示:
xoefb8l83#
您不需要下载和上传文件来覆盖S3中的文件;要覆盖现有对象,您只需上传同名文件,它将自动完成(reference)。请查看
put_object
函数(S3 doc)。因此,您的代码将如下所示: