我正在尝试从boto3 s3客户端对象模拟一个单一方法来抛出异常.但我需要这个类的所有其他方法正常工作.
这样我可以在执行upload_part_copy时测试单个异常测试并发生错误
第一次尝试
import boto3
from mock import patch
with patch('botocore.client.S3.upload_part_copy', side_effect=Exception('Error Uploading')) as mock:
client = boto3.client('s3')
# Should return actual result
o = client.get_object(Bucket='my-bucket', Key='my-key')
# Should return mocked exception
e = client.upload_part_copy()
Run Code Online (Sandbox Code Playgroud)
但是,这会产生以下错误:
ImportError: No module named S3
Run Code Online (Sandbox Code Playgroud)
第二次尝试
在查看了botocore.client.py源代码后,我发现它正在做一些聪明的事情并且该方法upload_part_copy不存在.我发现它似乎在调用,BaseClient._make_api_call所以我试图嘲笑它
import boto3
from mock import patch
with patch('botocore.client.BaseClient._make_api_call', side_effect=Exception('Error Uploading')) as mock:
client = boto3.client('s3')
# Should return actual result
o = client.get_object(Bucket='my-bucket', Key='my-key')
# Should return mocked exception
e …Run Code Online (Sandbox Code Playgroud) 我的桌子大约是220mb,里面有25万条记录.我正在尝试将所有这些数据都放到python中.我意识到这需要一个分块的批处理过程并循环,但我不知道如何设置批次从前一个停止的地方开始.
有没有办法过滤我的扫描?从我读到的,加载后发生过滤,加载停止在1mb,所以我实际上无法扫描新对象.
任何援助将不胜感激.
import boto3
dynamodb = boto3.resource('dynamodb',
aws_session_token = aws_session_token,
aws_access_key_id = aws_access_key_id,
aws_secret_access_key = aws_secret_access_key,
region_name = region
)
table = dynamodb.Table('widgetsTableName')
data = table.scan()
Run Code Online (Sandbox Code Playgroud) Boto3 Mavens,
客户端和资源之间的功能差异(如果有)是什么?
它们在功能上是否相同?
在什么条件下你会选择调用Boto3资源与客户端(反之亦然)?
虽然我已经努力通过RTM来回答这个问题......但遗憾的是,理解两者之间的功能差异使我望而却步.
你的意见?
许多人,许多的感谢!
飞机Wryter
我可以使用以下方式上传图像文件:
s3 = session.resource('s3')
bucket = s3.Bucket(S3_BUCKET)
bucket.upload_file(file, key)
Run Code Online (Sandbox Code Playgroud)
但是,我也希望公开这个文件.我尝试查找一些函数来为文件设置ACL,但似乎boto3已更改其API并删除了一些函数.有没有办法在最新版本的boto3中做到这一点?
我在虚拟环境中安装boto3时遇到问题.
我已经完成了文件所说的内容.首先我激活了虚拟环境.然后我做了一个:
Sudo pip install boto3
Run Code Online (Sandbox Code Playgroud)
现在我进入python
>> import boto3
ImportError: No module named boto3
Run Code Online (Sandbox Code Playgroud)
但是如果我导入boto,它就可以了
>> import boto
>> boto.Version
'2.38.0'
Run Code Online (Sandbox Code Playgroud)
为什么安装boto3时会安装boto 2.38.我试着关闭终端并重新打开它.我应该重启Ubuntu机器吗?
我这样读了我的S3桶中的文件名
objs = boto3.client.list_objects(Bucket='my_bucket')
while 'Contents' in objs.keys():
objs_contents = objs['Contents']
for i in range(len(objs_contents)):
filename = objs_contents[i]['Key']
Run Code Online (Sandbox Code Playgroud)
现在,我需要获取文件的实际内容,类似于open(filename).readlines().什么是最好的方法?
例如,我有这个代码:
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket-name')
# Does it exist???
Run Code Online (Sandbox Code Playgroud) 我需要在脚本中获取"当前用户" 的帐户IDboto3.到目前为止,我最好的解决方案是解析当前用户arn:
>>> import boto3
>>> account_id = boto3.resource('iam').CurrentUser().arn.split(':')[4]
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更"轻量级"的方法.事实上
>>> timeit.timeit("boto3.resource('iam').CurrentUser().arn",
... 'import boto3', number=10)
4.8895583080002325
Run Code Online (Sandbox Code Playgroud)
我实际上不需要CurrentUser脚本中的资源.
我是boto3中的新用户,我正在使用DynamoDB.
我经历了DynamoDB api,我找不到任何方法告诉我表是否已经存在.
处理此问题的最佳方法是什么?
我应该尝试创建一个新表并使用try catch包装它吗?
我有一个变量,它有aws s3 url
s3://bucket_name/folder1/folder2/file1.json
Run Code Online (Sandbox Code Playgroud)
我想在变量中获取bucket_name并在另一个变量中使用/folder1/folder2/file1.json.我尝试了正则表达式,可以得到如下所示的bucket_name,不确定是否有更好的方法.
m = re.search('(?<=s3:\/\/)[^\/]+', 's3://bucket_name/folder1/folder2/file1.json')
print(m.group(0))
Run Code Online (Sandbox Code Playgroud)
我怎么得到其余的ie - folder1/folder2/file1.json?
我检查了是否有boto3功能从URL中提取bucket_name和key,但找不到它.