如何使用url访问Python中的s3文件?

时间:2011-02-14 14:38:34

标签: python amazon-s3 cloud

我想写一个Python脚本,它将使用他们的url从s3读取和写入文件,例如:'s3:/ mybucket / file'。它需要在本地和云中运行而不需要任何代码更改。有没有办法做到这一点?

编辑:这里有一些很好的建议,但我真正想要的是允许我这样做的东西:

 myfile = open("s3://mybucket/file", "r")

然后像任何其他文件对象一样使用该文件对象。那真的很酷。如果它不存在,我可能会为自己写这样的东西。我可以在simples3或boto上构建那个抽象层。

6 个答案:

答案 0 :(得分:12)

开放时,应该如下:

import urllib
opener = urllib.URLopener()
myurl = "https://s3.amazonaws.com/skyl/fake.xyz"
myfile = opener.open(myurl)

如果文件是公共的,这将适用于s3。

要使用boto编写文件,它有点像这样:

from boto.s3.connection import S3Connection
conn = S3Connection(AWS_KEY, AWS_SECRET)
bucket = conn.get_bucket(BUCKET)
destination = bucket.new_key()
destination.name = filename
destination.set_contents_from_file(myfile)
destination.make_public()

知道这是否适合你:)

答案 1 :(得分:5)

Here's how they do

awscli

def find_bucket_key(s3_path):
    """
    This is a helper function that given an s3 path such that the path is of
    the form: bucket/key
    It will return the bucket and the key represented by the s3 path
    """
    s3_components = s3_path.split('/')
    bucket = s3_components[0]
    s3_key = ""
    if len(s3_components) > 1:
        s3_key = '/'.join(s3_components[1:])
    return bucket, s3_key


def split_s3_bucket_key(s3_path):
    """Split s3 path into bucket and key prefix.
    This will also handle the s3:// prefix.
    :return: Tuple of ('bucketname', 'keyname')
    """
    if s3_path.startswith('s3://'):
        s3_path = s3_path[5:]
    return find_bucket_key(s3_path)

你可以使用这样的代码

from awscli.customizations.s3.utils import split_s3_bucket_key
import boto3
client = boto3.client('s3')
bucket_name, key_name = split_s3_bucket_key(
    's3://example-bucket-name/path/to/example.txt')
response = client.get_object(Bucket=bucket_name, Key=key_name)

这并没有解决与作为file like object的s3键进行交互的目标,但这是朝这个方向迈出的一步。

答案 2 :(得分:3)

我没有看到可以直接使用S3网址的东西,但你可以使用S3 access librarysimples3看起来不错)和一些简单的字符串操作:

>>> url = "s3:/bucket/path/"
>>> _, path = url.split(":", 1)
>>> path = path.lstrip("/")
>>> bucket, path = path.split("/", 1)
>>> print bucket
'bucket'
>>> print path
'path/'

答案 3 :(得分:1)

您可以使用Boto Python API通过python访问S3。这是一个很好的图书馆在您安装Boto之后,以下示例程序将为您工作

>>> k = Key(b)
>>> k.key = 'yourfile'
>>> k.set_contents_from_filename('yourfile.txt')

您可以在http://boto.cloudhackers.com/s3_tut.html#storing-data

找到更多信息

答案 4 :(得分:1)

http://s3tools.org/s3cmd效果非常好,支持您想要的网址结构的s3://形式。它在Linux和Windows上开展业务。如果您需要在python程序中调用本机API,那么http://code.google.com/p/boto/是更好的选择。

答案 5 :(得分:0)

尝试s3fs

文档上的第一个示例:

>>> import s3fs
>>> fs = s3fs.S3FileSystem(anon=True)
>>> fs.ls('my-bucket')
['my-file.txt']
>>> with fs.open('my-bucket/my-file.txt', 'rb') as f:
...     print(f.read())
b'Hello, world'