我正在尝试读取上传到 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()
Run Code Online (Sandbox Code Playgroud)
我收到以下错误。
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
Run Code Online (Sandbox Code Playgroud)
我知道错误发生在 read() 处,但我不确定如何纠正此错误。
我用obj=s3.Object(AccessBucket.name, AccessFile)的是它并且obj=s3.Object(AccessBucket, AccessFile)它有效。
从get() 文档中,.get()返回一个StreamingBody. 这是一系列字节,而不是字符串。
从使用 Boto3 以字符串形式打开 S3 对象,您可以使用:
import boto3
s3 = boto3.resource('s3')
obj = s3.Object(bucket, key)
obj.get()['Body'].read().decode('utf-8')
Run Code Online (Sandbox Code Playgroud)
如果失败,那么我建议您将该对象下载到本地文件系统,然后使用标准 Python 命令读取该文件。
| 归档时间: |
|
| 查看次数: |
28981 次 |
| 最近记录: |