Python 使用AWS lambda函数在S3中创建新文件

Python 使用AWS lambda函数在S3中创建新文件,python,csv,amazon-s3,aws-lambda,Python,Csv,Amazon S3,Aws Lambda,我有一个要求,我的lambda函数创建一个新的CSV文件,并在写入后上传它。为此,我正在使用Python boto3 with open('mycsv.csv', 'w', newline ='') as f: thewriter = csv.writer(f) thewriter.writerow(['col1','col2','col3']) s3_client = boto3.client('s3') response = s3_client.uplo

我有一个要求,我的lambda函数创建一个新的CSV文件,并在写入后上传它。为此,我正在使用Python boto3

with open('mycsv.csv', 'w', newline ='') as f:
     thewriter = csv.writer(f)
     thewriter.writerow(['col1','col2','col3'])
     s3_client = boto3.client('s3')
    response = s3_client.upload_file('/tmp/' + mycsv.csv, 'my-bucket', 'myfoleder/'+mycsv.csv)
请注意,“mycsv.csv”文件并不存在,我希望能够作为lambda函数的一部分动态创建它。这可能吗?当lambda被触发时,我得到以下错误

[Errno 30] Read-only file system: 'mycsv.csv'

在lambda上,除了
/tmp
目录之外,文件系统大部分是只读的。打开文件进行写入时,需要转到
/tmp/mycsv.csv

with open('/tmp/mycsv.csv', 'w', newline ='') as f:
     thewriter = csv.writer(f)
     thewriter.writerow(['col1','col2','col3'])
     s3_client = boto3.client('s3')
     response = s3_client.upload_file('/tmp/mycsv.csv', 'my-bucket', 'myfoleder/mycsv.csv')

您也可以考虑使用Python,它将自动写入>TMP,并且一旦退出上下文管理器块,将删除该文件。

您可以跳过中间文件并完全在内存中处理您的数据。这样做的优点是速度更快,并允许您处理更大的数据。目前,在

/tmp
中只有512 MB的磁盘空间,但最多有3 GB的内存

import csv
import io

buffer = io.StringIO()
writer = csv.writer(buffer)
writer.writerow(['col1', 'col2', 'col3'])

buffer.seek(0)
s3_client = boto3.client('s3')
s3_client.upload_fileobj(buffer, 'my-bucket', 'my-folder/mycsv.csv')
还可以考虑压缩CSV文件。这将导致与S3之间更快、更便宜的传输

import gzip

# ...

buffer.seek(0)
compressed = io.BytesIO(gzip.compress(buffer.getvalue().encode('utf-8')))

s3_client = boto3.client('s3')
s3_client.upload_fileobj(compressed, 'my-bucket', 'my-folder/mycsv.csv.gz')

仔细的上载应在带有的
之外,否则文件仍处于打开状态。