在AWS中,我正在尝试使用Lambda函数以Python的方式将文件保存到S3。虽然这在我的本地计算机上可以工作,但我无法让它在Lambda中工作。我已经花了大部分时间解决这个问题,希望能得到帮助。谢谢。
在S3中,有一个名为
来自AWS的错误消息是
此外,我已尝试使用
此外,我已尝试使用
def pdfToTable(PDFfilename, apiKey, fileExt, bucket, key):
# parsing a PDF using an API
fileData = (PDFfilename, open(PDFfilename, "rb"))
files = {"f": fileData}
postUrl = "https://pdftables.com/api?key={0}&format={1}".format(apiKey, fileExt)
response = requests.post(postUrl, files=files)
response.raise_for_status()
# this code is probably the problem!
s3 = boto3.resource('s3')
bucket = s3.Bucket('transportation.manifests.parsed')
with open('/tmp/output2.csv', 'rb') as data:
data.write(response.content)
key = 'csv/' + key
bucket.upload_fileobj(data, key)
# FYI, on my own computer, this saves the file
with open('output.csv', "wb") as f:
f.write(response.content)
在S3中,有一个名为
transportation.manifests.parsed
的存储桶,其中包含应保存文件的文件夹csv
。
response.content
的类型是字节。来自AWS的错误消息是
[Errno 2] No such file or directory: '/tmp/output2.csv': FileNotFoundError.
实际上,我的目标是将文件保存到csv文件夹下,并使用唯一的名称,因此tmp/output2.csv
可能不是最佳方法。有什么建议吗?此外,我已尝试使用
wb
和w
而不是rb
,但也没有成功。使用wb
的错误是Input <_io.BufferedWriter name='/tmp/output2.csv'> of type: <class '_io.BufferedWriter'> is not supported.
文档建议使用'rb'是推荐的用法,但我不明白为什么会这样。此外,我已尝试使用
s3_client.put_object(Key=key, Body=response.content, Bucket=bucket)
,但收到调用HeadObject操作时出现错误(404):未找到
的错误提示。
open('/tmp/output2.csv', 'rb')
,但是你正在尝试写入文件。请注意,你可能不需要创建临时文件。Bucket 有一个put_object
方法可以使用。 - AlasdairInput <_io.TextIOWrapper name='/tmp/output2.csv' mode='w' encoding='UTF-8'> of type: <class '_io.TextIOWrapper'> is not supported
。 - tskittles'w'
或者wb
来写入文件。你提供的文档是用于上传文件的,这是一个单独的步骤。你没有展示足够的信息来知道为什么put_object
失败了。既然你已经有了bucket,我会这样做:bucket.put_object(Key=key, Body=response.content)
。如果这不起作用,你应该展示你尝试过的完整代码和完整的traceback。 - Alasdair