Как я могу получить доступ к файлам s3 в Python, используя URL-адреса? - PullRequest
22 голосов
/ 14 февраля 2011

Я хочу написать скрипт Python, который будет читать и записывать файлы из s3, используя их URL, например: 's3: / mybucket / file'. Это должно было бы работать локально и в облаке без каких-либо изменений кода. Есть ли способ сделать это?

Редактировать: Здесь есть несколько хороших предложений, но я действительно хочу кое-что, что позволяет мне сделать это:

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

, а затем используйте этот объект файла, как и любой другой объект файла. Это было бы действительно круто. Я мог бы просто написать что-то подобное для себя, если его не существует. Я мог бы построить этот слой абстракции на simples3 или boto.

Ответы [ 5 ]

12 голосов
/ 16 февраля 2011

Для открытия, это должно быть просто:

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()

Дай мне знать, если это работает для вас:)

5 голосов
/ 01 июня 2017

Вот как они это делают это в 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)

Это не решает задачу взаимодействия с ключом s3 в виде файла, подобного объекту , но это шаг в этом направлении.

3 голосов
/ 14 февраля 2011

Я не видел чего-то, что работало бы непосредственно с URL-адресами S3, но вы могли бы использовать библиотеку доступа S3 ( simples3 выглядит прилично) и некоторые простые операции с строками:

>>> url = "s3:/bucket/path/"
>>> _, path = url.split(":", 1)
>>> path = path.lstrip("/")
>>> bucket, path = path.split("/", 1)
>>> print bucket
'bucket'
>>> print path
'path/'
1 голос
/ 14 февраля 2011

http://s3tools.org/s3cmd работает довольно хорошо и поддерживает форму s3: // структуры URL, которую вы хотите. Это делает бизнес на Linux и Windows. Если вам нужен собственный API для вызова из программы Python, тогда http://code.google.com/p/boto/ - лучший выбор.

1 голос
/ 14 февраля 2011

Вы можете использовать Boto Python API для доступа к S3 через python.Это хорошая библиотека.После того, как вы выполните установку Boto, следующий образец программы будет работать для вас

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

Более подробную информацию можно найти здесь http://boto.cloudhackers.com/s3_tut.html#storing-data

...