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