Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python s3.Object()抛出TypeError:序列项0:应为str实例,找到元组_Python_Amazon S3_Boto3_Digital Ocean - Fatal编程技术网

Python s3.Object()抛出TypeError:序列项0:应为str实例,找到元组

Python s3.Object()抛出TypeError:序列项0:应为str实例,找到元组,python,amazon-s3,boto3,digital-ocean,Python,Amazon S3,Boto3,Digital Ocean,根据boto3文档,我尝试了以下操作: session = boto3.Session( aws_access_key_id=KEY, aws_secret_access_key=SECRET_KEY ) s3 = session.resource('s3') obj = s3.Object('test', 'test/myfile.csv') 当我运行obj.get()时,我收到: TypeError:序列项0:应为str实例,找到元组 我需要获取此csv文件的内容 当我尝试使用客户端而不

根据boto3文档,我尝试了以下操作:

session = boto3.Session(
aws_access_key_id=KEY,
aws_secret_access_key=SECRET_KEY
)
s3 = session.resource('s3')

obj = s3.Object('test', 'test/myfile.csv')
当我运行obj.get()时,我收到:

TypeError:序列项0:应为str实例,找到元组

我需要获取此csv文件的内容

当我尝试使用客户端而不是会话执行相同操作时,它会起作用:

s3 = boto3.client('s3')
obj = s3.get_object(Bucket='test', Key='test/myfile.csv')

此问题适用于AWS S3铲斗和DigitalOcean Spaces铲斗

要复制错误,请执行以下操作:

import boto3

KEY = '********************',
SECRET_KEY = '*******************************************'

# Initialize a session using DigitalOcean Spaces.
session = boto3.session.Session()

client = session.client('s3', region_name='sgp1',
                        endpoint_url='https://sgp1.digitaloceanspaces.com',
                        aws_access_key_id=KEY,
                        aws_secret_access_key=SECRET_KEY)
~/.pyenv/versions/3.8.0/lib/python3.8/site-packages/botocore/auth.py in scope(self, request)
    322         scope.append(self._service_name)
    323         scope.append('aws4_request')
--> 324         return '/'.join(scope)
    325 
    326     def credential_scope(self, request):

TypeError: sequence item 0: expected str instance, tuple found
抛出错误:

import boto3

KEY = '********************',
SECRET_KEY = '*******************************************'

# Initialize a session using DigitalOcean Spaces.
session = boto3.session.Session()

client = session.client('s3', region_name='sgp1',
                        endpoint_url='https://sgp1.digitaloceanspaces.com',
                        aws_access_key_id=KEY,
                        aws_secret_access_key=SECRET_KEY)
~/.pyenv/versions/3.8.0/lib/python3.8/site-packages/botocore/auth.py in scope(self, request)
    322         scope.append(self._service_name)
    323         scope.append('aws4_request')
--> 324         return '/'.join(scope)
    325 
    326     def credential_scope(self, request):

TypeError: sequence item 0: expected str instance, tuple found
看起来API有点问题,但如果我们仔细看

>>>print(type(SECRET_KEY))
str

>>> print(type(KEY))
tuple
如所评论的,其中一个auth键中有一个
元组
类型

请注意上面代码中的逗号:

import boto3

KEY = '********************',
只需通过删除逗号将其更改为字符串类型:

import boto3

KEY = '********************',
SECRET_KEY = '*******************************************'

# Initialize a session using DigitalOcean Spaces.
session = boto3.session.Session()

client = session.client('s3', region_name='sgp1',
                        endpoint_url='https://sgp1.digitaloceanspaces.com',
                        aws_access_key_id=KEY,
                        aws_secret_access_key=SECRET_KEY)
[out]:

{'ResponseMetadata': {'RequestId': '*************',
  'HostId': '',
  'HTTPStatusCode': 200,
  'HTTPHeaders': {'transfer-encoding': 'chunked',
   'x-amz-request-id': '*************',
   'content-type': 'application/xml',
   'date': 'Mon, 15 Jun 2020 01:14:42 GMT',
   'strict-transport-security': 'max-age=15552000; includeSubDomains; preload'},
  'RetryAttempts': 0},
 'Buckets': [{'Name': '*****',
   'CreationDate': datetime.datetime(2019, 11, 20, 8, 28, 36, 548000, tzinfo=tzutc())}],
 'Owner': {'DisplayName': '*******', 'ID': '********'}}

我以前见过类似的情况,它实际上是从坏参数到
bot3.Session(…)
的延迟错误——这些参数没有按照您期望的方式进行验证,如果
KEY
SECRET\u KEY
的值(或未显示的另一个参数)实际上不是字符串,此错误在会话第一次尝试对请求进行签名时弹出。如果您查看完整的堆栈跟踪,就会发现这一点。记录这些值,以检查这一点。