标签: boto3

将数据帧直接保存到csv到s3 Python

我有一个pandas DataFrame,我想上传到新的CSV文件.问题是我不想在将文件传输到s3之前将其保存在本地.是否有像to_csv这样的方法直接将数据帧写入s3?我正在使用boto3.
这是我到目前为止:

import boto3
s3 = boto3.client('s3', aws_access_key_id='key', aws_secret_access_key='secret_key')
read_file = s3.get_object(Bucket, Key)
df = pd.read_csv(read_file['Body'])

# Make alterations to DataFrame

# Then export DataFrame to CSV through direct transfer to s3
Run Code Online (Sandbox Code Playgroud)

python csv amazon-s3 dataframe boto3

87
推荐指数
8
解决办法
6万
查看次数

如何使用boto3将文件或数据写入S3对象

在boto 2中,您可以使用以下方法写入S3对象:

是否有boto 3等效?将数据保存到存储在S3上的对象的boto3方法是什么?

python amazon-s3 boto amazon-web-services boto3

75
推荐指数
7
解决办法
14万
查看次数

如何将AWS S3上的文本文件导入到pandas中而无需写入磁盘

我有一个文本文件保存在S3上,这是一个制表符分隔表.我想将它加载到pandas但不能保存它,因为我在heroku服务器上运行.这是我到目前为止所拥有的.

import io
import boto3
import os
import pandas as pd

os.environ["AWS_ACCESS_KEY_ID"] = "xxxxxxxx"
os.environ["AWS_SECRET_ACCESS_KEY"] = "xxxxxxxx"

s3_client = boto3.client('s3')
response = s3_client.get_object(Bucket="my_bucket",Key="filename.txt")
file = response["Body"]


pd.read_csv(file, header=14, delimiter="\t", low_memory=False)
Run Code Online (Sandbox Code Playgroud)

错误是

OSError: Expected file path name or file-like object, got <class 'bytes'> type
Run Code Online (Sandbox Code Playgroud)

如何将响应体转换为pandas接受的格式?

pd.read_csv(io.StringIO(file), header=14, delimiter="\t", low_memory=False)

returns

TypeError: initial_value must be str or None, not StreamingBody

pd.read_csv(io.BytesIO(file), header=14, delimiter="\t", low_memory=False)

returns

TypeError: 'StreamingBody' does not support the buffer interface
Run Code Online (Sandbox Code Playgroud)

更新 - 使用以下工作

file = response["Body"].read()
Run Code Online (Sandbox Code Playgroud)

pd.read_csv(io.BytesIO(file), header=14, …
Run Code Online (Sandbox Code Playgroud)

python heroku amazon-s3 pandas boto3

68
推荐指数
5
解决办法
5万
查看次数

Boto3从S3 Bucket下载所有文件

我正在使用boto3从s3存储桶中获取文件.我需要类似的功能aws s3 sync

我目前的代码是

#!/usr/bin/python
import boto3
s3=boto3.client('s3')
list=s3.list_objects(Bucket='my_bucket_name')['Contents']
for key in list:
    s3.download_file('my_bucket_name', key['Key'], key['Key'])
Run Code Online (Sandbox Code Playgroud)

只要存储桶只有文件,这工作正常.如果存储桶中存在文件夹,则会抛出错误

Traceback (most recent call last):
  File "./test", line 6, in <module>
    s3.download_file('my_bucket_name', key['Key'], key['Key'])
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/inject.py", line 58, in download_file
    extra_args=ExtraArgs, callback=Callback)
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 651, in download_file
    extra_args, callback)
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 666, in _download_file
    self._get_object(bucket, key, filename, extra_args, callback)
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 690, in _get_object
    extra_args, callback)
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 707, in _do_get_object
    with self._osutil.open(filename, 'wb') as f:
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", …
Run Code Online (Sandbox Code Playgroud)

python amazon-s3 amazon-web-services boto3

66
推荐指数
7
解决办法
8万
查看次数

连接到boto3 S3时如何指定凭据?

在boto上我以这种方式连接S3时用来指定我的凭据:

import boto
from boto.s3.connection import Key, S3Connection
S3 = S3Connection( settings.AWS_SERVER_PUBLIC_KEY, settings.AWS_SERVER_SECRET_KEY )
Run Code Online (Sandbox Code Playgroud)

然后我可以使用S3来执行我的操作(在我的情况下从桶中删除一个对象).

使用boto3我发现的所有例子都是这样的:

import boto3
S3 = boto3.resource( 's3' )
S3.Object( bucket_name, key_name ).delete()
Run Code Online (Sandbox Code Playgroud)

我无法指定我的凭据,因此所有尝试都失败并InvalidAccessKeyId出现错误.

如何使用boto3指定凭据?

python amazon-s3 amazon-web-services boto3

66
推荐指数
5
解决办法
5万
查看次数

是否可以在update_item中组合if_not_exists和list_append

我正在尝试update_item在boto3中使用DynamoDB 的功能.

我现在正在努力更新物品清单.如果列表尚不存在,我想创建一个新列表,否则将附加到现有列表.

如果列表尚不存在,则使用UpdateExpression表单的a SET my_list = list_append(my_list, :my_value)返回错误"提供的表达式引用项目中不存在的属性".

知道我怎么修改我的UpdateExpression

谢谢和最好的问候,Fabian

amazon-dynamodb boto3

57
推荐指数
2
解决办法
1万
查看次数

在 AWS Lambda 上使用层时“无法从 'urllib3.util.ssl_' 导入名称 'DEFAULT_CIPHERS'”

我想要实现什么

使用 AWS Lambda 抓取网站并将数据保存在 S3 上。

我遇到的问题

当我执行 Lambda 时,出现以下错误消息。

{“errorMessage”:“无法导入模块“lambda_function”:无法从“urllib3.util.ssl_”(/opt/python/urllib3/util/ssl_.py)导入名称“DEFAULT_CIPHERS””,“errorType”:“运行时.ImportModuleError", "requestId": "fb66bea9-cbad-4bd3-bd4d-6125454e21be", "stackTrace": [] }

代码

最小 Lambda 代码如下。

import requests
import boto3 

def lambda_handler(event, context):
    s3 = boto3.client('s3')
    upload_res = s3.put_object(Bucket='horserace-dx', Key='/raw/a.html', Body='testtext')
    
    return event
Run Code Online (Sandbox Code Playgroud)

Lambda 上添加了一层。使用以下命令将文件保存在python文件夹中,冻结在 zip 文件中,然后作为层上传到 AWS Lambda。

!pip install requests -t ./python --no-user
!pip install pandas -t ./python --no-user
!pip install beautifulsoup4 -t ./python --no-user
Run Code Online (Sandbox Code Playgroud)
  • horserace-dx已存在
  • 该文件夹raw存在
  • Lambda 的角色已正确设置。它可以读取和写入S3
  • Lambda 的运行时是 Python 3.9。本地计算机的python版本是3.9.13。

到目前为止我做了什么

我搜索“无法从‘urllib3.util.ssl_’导入名称‘DEFAULT_CIPHERS’”并找到了一些建议。我用以下代码制作了图层,然后再次尝试,但没有成功。

!pip install …
Run Code Online (Sandbox Code Playgroud)

python amazon-s3 amazon-web-services boto3 aws-lambda

56
推荐指数
6
解决办法
7万
查看次数

Boto3/S3:使用copy_object重命名对象

我正在尝试使用python boto3在我的s3存储桶中重命名文件,我无法清楚地理解这些参数.有人可以帮我吗?

我正在计划的是将对象复制到新对象,然后删除实际对象.

我在这里发现了类似的问题,但我需要使用boto3的解决方案.

python amazon-s3 amazon-web-services boto3

55
推荐指数
3
解决办法
4万
查看次数

何时使用boto3客户端以及何时使用boto3资源?

我试图了解何时应该使用资源以及何时应该使用客户端.

boto3文档中提供的定义在使用其中一个或另一个时更不清楚.

amazon-web-services boto3

54
推荐指数
1
解决办法
2万
查看次数

从boto3中检索S3存储桶中的子文件夹名称

使用boto3,我可以访问我的AWS S3存储桶:

s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket-name')
Run Code Online (Sandbox Code Playgroud)

现在,存储桶包含文件夹first-level,该文件夹本身包含多个以时间戳命名的子文件夹1456753904534.我需要知道我正在做的另一个工作的这些子文件夹的名称,我想知道我是否可以让boto3为我检索这些.

所以我尝试过:

objs = bucket.meta.client.list_objects(Bucket='my-bucket-name')
Run Code Online (Sandbox Code Playgroud)

它提供了一个字典,其中的"内容"键为我提供了所有第三级文件而不是第二级时间戳目录,实际上我得到一个包含所有内容的列表

{u'ETag':'"etag"',u'Key':first-level/1456753904534/part-00014',u'LastModified':datetime.datetime(2016,2,29,13,52,24,tzinfo = tzutc()),
u'Owner':{u'DisplayName':'owner',u'ID':'id'},
u'Size':size,u'StorageClass':'storageclass'}

您可以看到在这种情况下part-00014检索特定文件,而我想单独获取目录的名称.原则上我可以从所有路径中删除目录名称,但是在第三级检索所有内容以获得第二级别是丑陋且昂贵的!

我也试过这里报道的事情:

for o in bucket.objects.filter(Delimiter='/'):
    print(o.key)
Run Code Online (Sandbox Code Playgroud)

但我没有得到所需级别的文件夹.

有办法解决这个问题吗?

python amazon-s3 amazon-web-services boto3

52
推荐指数
9
解决办法
8万
查看次数