我有一个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) 在boto 2中,您可以使用以下方法写入S3对象:
是否有boto 3等效?将数据保存到存储在S3上的对象的boto3方法是什么?
我有一个文本文件保存在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) 我正在使用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) 在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指定凭据?
我正在尝试update_item在boto3中使用DynamoDB 的功能.
我现在正在努力更新物品清单.如果列表尚不存在,我想创建一个新列表,否则将附加到现有列表.
如果列表尚不存在,则使用UpdateExpression表单的a SET my_list = list_append(my_list, :my_value)返回错误"提供的表达式引用项目中不存在的属性".
知道我怎么修改我的UpdateExpression?
谢谢和最好的问候,Fabian
使用 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存在我搜索“无法从‘urllib3.util.ssl_’导入名称‘DEFAULT_CIPHERS’”并找到了一些建议。我用以下代码制作了图层,然后再次尝试,但没有成功。
!pip install …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用python boto3在我的s3存储桶中重命名文件,我无法清楚地理解这些参数.有人可以帮我吗?
我正在计划的是将对象复制到新对象,然后删除实际对象.
我在这里发现了类似的问题,但我需要使用boto3的解决方案.
使用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)
但我没有得到所需级别的文件夹.
有办法解决这个问题吗?