使用AWS和Python中的Lambda将文件写入S3

使用AWS和Python中的Lambda将文件写入S3,python,amazon-web-services,amazon-s3,aws-lambda,Python,Amazon Web Services,Amazon S3,Aws Lambda,在AWS中,我尝试使用Lambda函数将文件保存到Python中的S3。虽然这在我的本地计算机上工作,但我无法让它在Lambda中工作。我一天中大部分时间都在解决这个问题,非常感谢您的帮助。多谢各位 def pdfToTable(PDFfilename, apiKey, fileExt, bucket, key): # parsing a PDF using an API fileData = (PDFfilename, open(PDFfilename, "rb"))

在AWS中,我尝试使用Lambda函数将文件保存到Python中的S3。虽然这在我的本地计算机上工作,但我无法让它在Lambda中工作。我一天中大部分时间都在解决这个问题,非常感谢您的帮助。多谢各位

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)

在S3中,有一个bucket
transportation.manifests.parsed
包含文件应保存的文件夹
csv

response.content的类型为字节

从AWS来看,上述当前设置的错误是
[Errno 2]没有这样的文件或目录:'/tmp/output2.csv':FileNotFoundError。
事实上,我的目标是以唯一的名称将文件保存到csv文件夹,因此
tmp/output2.csv
可能不是最好的方法。有什么指导吗

此外,我尝试使用
wb
w
而不是
rb
也没有效果。
wb
的错误是
输入类型:不受支持。
建议使用“rb”,但我不明白为什么会这样


此外,我还尝试了
s3\u client.put\u object(Key=Key,Body=response.content,Bucket=Bucket)
,但在调用HeadObject操作时出现了一个错误(404):notfound

,假设使用Python 3.6。我通常的做法是将字节内容包装在包装器中,以创建类似文件的对象。并且,根据您可用于托管转账的boto3文档:

from io import BytesIO
import boto3
s3 = boto3.client('s3')

fileobj = BytesIO(response.content)

s3.upload_fileobj(fileobj, 'mybucket', 'mykey')

如果这不起作用,我会仔细检查所有IAM权限是否正确。

您有一个可写流,您要求bot3将其用作一个不起作用的可读流

编写文件,然后简单地使用bucket.upload_file(),如下所示:

s3 = boto3.resource('s3')
bucket = s3.Bucket('transportation.manifests.parsed')
with open('/tmp/output2.csv', 'w') as data:
    data.write(response.content)

key = 'csv/' + key
bucket.upload_file('/tmp/output2.csv', key)

您已打开('/tmp/output2.csv',rb'),但您正在尝试写入该文件。注意,您可能不必创建临时文件。这个bucket有一个你可以使用的方法。只是更新了帖子以反映对你评论的回应。想法?你需要解决@Alasdair指出的问题。您正试图打开一个不存在的文件进行读取,因此您会得到FileNotFoundError)。你需要打开它来写作。加上CSV文件是文本文件,而不是二进制文件,所以“wt”(或者只是“w”,因为文本是默认值)通常更合适。@jarmod当我将其切换到“w”时,错误是
输入类型:不受支持
您需要使用
'w'
wb
来写入文件。您链接到的文档用于上载该文件,这是一个单独的步骤。您没有显示足够的信息,无法了解
放置对象失败的原因。你已经有了bucket,所以我要做
bucket.put\u object(Key=Key,Body=response.content)
。如果这不起作用,您应该显示您尝试的完整代码,以及完整的回溯。
s3 = boto3.resource('s3')
bucket = s3.Bucket('transportation.manifests.parsed')
with open('/tmp/output2.csv', 'w') as data:
    data.write(response.content)

key = 'csv/' + key
bucket.upload_file('/tmp/output2.csv', key)