Boto3对象读取类型错误:预期的字符串或类似字节的对象

时间:2018-08-19 10:40:10

标签: amazon-s3

我正在尝试读取上载到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),它正在工作。

2 个答案:

答案 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)

当存储桶名称配置正确时,我遇到了类似的问题。