无法检索 python/boto 中的已知密钥
Unable to retrieve known keys in python/boto
我正在尝试使用 python 和 boto 连接到同事的 S3 存储桶。我以前可以毫无问题地执行此操作,但他们最近将 prefixes/directories 添加到存储桶中,我无法再访问密钥。
任何使用 bucket.get_key(keyname) return NoneType 获取密钥的尝试。如果我使用 bucket.get_all_keys() 获取所有密钥,我会得到一长串密钥。
>>> s3 = boto.connect_s3()
>>> bucket = s3.get_bucket('bucket_name')
>>> keys=bucket.get_all_keys()
>>> len(keys)
1000
>>> keys[5:7]
[<Key: bucketname,/prod/keyname>, <Key: bucketname,/prod/keyname>]
>>> keys[6].get_contents_as_string()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/myusername/.pyenv/versions/2.7.8/lib/python2.7/site-packages/boto/s3/key.py", line 1782, in get_contents_as_string
response_headers=response_headers)
File "/home/myusername/.pyenv/versions/2.7.8/lib/python2.7/site-packages/boto/s3/key.py", line 1650, in get_contents_to_file
response_headers=response_headers)
File "/home/myusername/.pyenv/versions/2.7.8/lib/python2.7/site-packages/boto/s3/key.py", line 1482, in get_file
query_args=None)
File "/home/myusername/.pyenv/versions/2.7.8/lib/python2.7/site-packages/boto/s3/key.py", line 1514, in _get_file_internal
override_num_retries=override_num_retries)
File "/home/myusername/.pyenv/versions/2.7.8/lib/python2.7/site-packages/boto/s3/key.py", line 343, in open
override_num_retries=override_num_retries)
File "/home/myusername/.pyenv/versions/2.7.8/lib/python2.7/site-packages/boto/s3/key.py", line 303, in open_read
self.resp.reason, body)
boto.exception.S3ResponseError: S3ResponseError: 404 Not Found
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>NoSuchKey</Code><Message>The specified key does not exist.
我隐藏了一些信息,但它们的键名和前缀采用 /prod/word-123-123 的形式,其中名称中有破折号和数字。
发生这种情况有什么原因吗?既然有 prefixes/directories,我是否必须以不同的方式对待事情?
edit: 我刚刚让同事添加了一个没有前缀的项目,我能够成功地获得它。
>>> bucket.get_key('test-bucket-item')
<Key: bucketname,test-bucket-item>
>>> key=bucket.get_key('test-bucket-item')
>>> key.get_contents_as_string()
'test contents'
按照 mootmoot 的建议,我安装了 boto3。
http://boto3.readthedocs.io/en/latest/guide/migration.html
boto3 的工作方式与 boto 非常不同,因此我不得不对我的代码进行一些更改。可以在此处找到文档。
我正在尝试使用 python 和 boto 连接到同事的 S3 存储桶。我以前可以毫无问题地执行此操作,但他们最近将 prefixes/directories 添加到存储桶中,我无法再访问密钥。
任何使用 bucket.get_key(keyname) return NoneType 获取密钥的尝试。如果我使用 bucket.get_all_keys() 获取所有密钥,我会得到一长串密钥。
>>> s3 = boto.connect_s3()
>>> bucket = s3.get_bucket('bucket_name')
>>> keys=bucket.get_all_keys()
>>> len(keys)
1000
>>> keys[5:7]
[<Key: bucketname,/prod/keyname>, <Key: bucketname,/prod/keyname>]
>>> keys[6].get_contents_as_string()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/myusername/.pyenv/versions/2.7.8/lib/python2.7/site-packages/boto/s3/key.py", line 1782, in get_contents_as_string
response_headers=response_headers)
File "/home/myusername/.pyenv/versions/2.7.8/lib/python2.7/site-packages/boto/s3/key.py", line 1650, in get_contents_to_file
response_headers=response_headers)
File "/home/myusername/.pyenv/versions/2.7.8/lib/python2.7/site-packages/boto/s3/key.py", line 1482, in get_file
query_args=None)
File "/home/myusername/.pyenv/versions/2.7.8/lib/python2.7/site-packages/boto/s3/key.py", line 1514, in _get_file_internal
override_num_retries=override_num_retries)
File "/home/myusername/.pyenv/versions/2.7.8/lib/python2.7/site-packages/boto/s3/key.py", line 343, in open
override_num_retries=override_num_retries)
File "/home/myusername/.pyenv/versions/2.7.8/lib/python2.7/site-packages/boto/s3/key.py", line 303, in open_read
self.resp.reason, body)
boto.exception.S3ResponseError: S3ResponseError: 404 Not Found
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>NoSuchKey</Code><Message>The specified key does not exist.
我隐藏了一些信息,但它们的键名和前缀采用 /prod/word-123-123 的形式,其中名称中有破折号和数字。
发生这种情况有什么原因吗?既然有 prefixes/directories,我是否必须以不同的方式对待事情?
edit: 我刚刚让同事添加了一个没有前缀的项目,我能够成功地获得它。
>>> bucket.get_key('test-bucket-item')
<Key: bucketname,test-bucket-item>
>>> key=bucket.get_key('test-bucket-item')
>>> key.get_contents_as_string()
'test contents'
按照 mootmoot 的建议,我安装了 boto3。
http://boto3.readthedocs.io/en/latest/guide/migration.html
boto3 的工作方式与 boto 非常不同,因此我不得不对我的代码进行一些更改。可以在此处找到文档。