Python 使用AWS lambda函数在S3中创建新文件
我有一个要求,我的lambda函数创建一个新的CSV文件,并在写入后上传它。为此,我正在使用Python boto3Python 使用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
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
中只有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')
仔细的上载应在带有的
之外,否则文件仍处于打开状态。