python - s3 urls - 获取存储桶名称和路径

标签 python boto3

我有一个具有 aws s3 url 的变量

s3://bucket_name/folder1/folder2/file1.json

我想在一个变量中获取 bucket_name 并在另一个变量中休息,即/folder1/folder2/file1.json。我尝试了正则表达式,可以得到如下的bucket_name,不知道是否有更好的方法。

m = re.search('(?<=s3:\/\/)[^\/]+', 's3://bucket_name/folder1/folder2/file1.json')
print(m.group(0))

我如何获得其余部分,即 - folder1/folder2/file1.json?

我检查了是否有 boto3 功能可以从 url 中提取 bucket_name 和 key,但找不到。

最佳答案

由于只是一个普通的URL,你可以使用urlparse来获取URL的所有部分。

>>> from urlparse import urlparse
>>> o = urlparse('s3://bucket_name/folder1/folder2/file1.json', allow_fragments=False)
>>> o
ParseResult(scheme='s3', netloc='bucket_name', path='/folder1/folder2/file1.json', params='', query='', fragment='')
>>> o.netloc
'bucket_name'
>>> o.path
'/folder1/folder2/file1.json'

您可能必须按照下一个答案的建议从键中删除开头的斜杠。

o.path.lstrip('/')

随着 Python 3 urlparse 移动到 urllib.parse 所以使用:

from urllib.parse import urlparse

这是一个处理所有细节的类。

try:
    from urlparse import urlparse
except ImportError:
    from urllib.parse import urlparse


class S3Url(object):
    """
    >>> s = S3Url("s3://bucket/hello/world")
    >>> s.bucket
    'bucket'
    >>> s.key
    'hello/world'
    >>> s.url
    's3://bucket/hello/world'

    >>> s = S3Url("s3://bucket/hello/world?qwe1=3#ddd")
    >>> s.bucket
    'bucket'
    >>> s.key
    'hello/world?qwe1=3#ddd'
    >>> s.url
    's3://bucket/hello/world?qwe1=3#ddd'

    >>> s = S3Url("s3://bucket/hello/world#foo?bar=2")
    >>> s.key
    'hello/world#foo?bar=2'
    >>> s.url
    's3://bucket/hello/world#foo?bar=2'
    """

    def __init__(self, url):
        self._parsed = urlparse(url, allow_fragments=False)

    @property
    def bucket(self):
        return self._parsed.netloc

    @property
    def key(self):
        if self._parsed.query:
            return self._parsed.path.lstrip('/') + '?' + self._parsed.query
        else:
            return self._parsed.path.lstrip('/')

    @property
    def url(self):
        return self._parsed.geturl()

关于python - s3 urls - 获取存储桶名称和路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42641315/

相关文章:

python - Kivy:图像的绝对位置和大小

amazon-web-services - Cloudformation SimpleAD 分配自定义安全组

python - 异步执行时的 AWS Lambda 回调

python - 上市后 S3 key 不立即出现

python - Cloudfront 与 S3 签名 URL 和 Boto3

python - 使用 Python 解析 CloudTrail 日志

python - NLTK 停用词无法识别句子中的 'i'

python - 清洁整个屏幕

python - 使用字符串的值调用值的列表

python - pandas:链式方法的组合,如 .resample()、.rolling() 等