我正在尝试读取上载到Amazon s3存储桶的.txt文件中的文本。但是我遇到了错误。
import boto3
import json
s3= boto3.resource('s3')
bucketList=[]
i=1
for bucket in s3.buckets.all():
print(str(i)+'.' + bucket.name)
bucketList.append(bucket)
i=i+1
BucketSel=int(input('Select from the bucket list using number'))
AccessBucket=bucketList[BucketSel-1]
FileList=[]
for obj in AccessBucket.objects.all():
print(obj.key)
FileList.append(obj.key)
FileSel=int(input('Select the File from the List using number'))
AccessFile=FileList[FileSel-1]
obj=s3.Object(AccessBucket, AccessFile)
str=obj.get()['Body'].read()
我收到以下错误消息。
Traceback (most recent call last):
File "G:\pyworkspace\BucketSelectFromList.py", line 20, in <module>
str=obj.get()['Body'].read()
File "C:\Program Files\Python37\lib\site-packages\boto3\resources\factory.py", line 520, in do_action
response = action(self, *args, **kwargs)
File "C:\Program Files\Python37\lib\site-packages\boto3\resources\action.py", line 83, in __call__
response = getattr(parent.meta.client, operation_name)(**params)
File "C:\Program Files\Python37\lib\site-packages\botocore\client.py", line 314, in _api_call
return self._make_api_call(operation_name, kwargs)
File "C:\Program Files\Python37\lib\site-packages\botocore\client.py", line 586, in _make_api_call
api_params, operation_model, context=request_context)
File "C:\Program Files\Python37\lib\site-packages\botocore\client.py", line 619, in _convert_to_request_dict
api_params, operation_model, context)
File "C:\Program Files\Python37\lib\site-packages\botocore\client.py", line 648, in _emit_api_params
params=api_params, model=operation_model, context=context)
File "C:\Program Files\Python37\lib\site-packages\botocore\hooks.py", line 227, in emit
return self._emit(event_name, kwargs)
File "C:\Program Files\Python37\lib\site-packages\botocore\hooks.py", line 210, in _emit
response = handler(**kwargs)
File "C:\Program Files\Python37\lib\site-packages\botocore\handlers.py", line 217, in validate_bucket_name
if VALID_BUCKET.search(bucket) is None:
TypeError: expected string or bytes-like object
我知道该错误发生在read()上,但是我不确定该如何纠正该错误。
我使用了obj=s3.Object(AccessBucket.name, AccessFile)
而不是obj=s3.Object(AccessBucket, AccessFile)
,它正在工作。
答案 0 :(得分:0)
.get()
从get() documentation返回StreamingBody
。这是一系列的字节,而不是字符串。
在Open S3 object as a string with Boto3中,您可以使用:
import boto3
s3 = boto3.resource('s3')
obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8')
如果失败,那么我建议您下载该对象到本地文件系统,然后使用标准的Python命令读取该文件。
答案 1 :(得分:0)
当存储桶名称配置正确时,我遇到了类似的问题。