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

zqry0prt  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(171)

我要求我的lambda函数创建一个新的CSV文件,并在写入后上传它。

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'
8ehkhllq

8ehkhllq1#

在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', 'myfolder/mycsv.csv')

你也可以考虑使用Python的tempfile.NamedTemporaryFile,它会自动写入/tmp,并在你退出上下文管理器块时删除该文件。

ttvkxqim

ttvkxqim2#

您可以跳过中间文件,完全在内存中处理数据。这样做的好处是速度更快,并且允许您处理更大的数据。目前,Lambda offers/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')

相关问题