web-dev-qa-db-ja.com

URLを使用してPythonのs3ファイルにアクセスするにはどうすればよいですか?

Pythonスクリプトで、s3のファイルのURLを使用してファイルの読み取りと書き込みを行います。例: 's3:/ mybucket/file'。ローカルとクラウドで実行する必要があります。コードの変更があります。これを行う方法はありますか?

編集:ここにはいくつかの良い提案がありますが、私が本当に欲しいのはこれを可能にするものです:

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

次に、そのファイルオブジェクトを他のファイルオブジェクトと同じように使用します。それは本当に素晴らしいでしょう。このようなものがない場合は、自分でこのように書くだけかもしれません。 simples3またはbotoにその抽象化レイヤーを構築できます。

26
Nate Reed

開くには、次のようにシンプルにする必要があります。

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

lemmeこれがあなたのために働くかどうかを知っています:)

12
Skylar Saveland

これがその方法です それは 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キーを オブジェクトのようなファイル として操作するという目標には対応していませんが、その方向へのステップです。

6
gene_wood

S3のURLで直接動作するものは見たことがありませんが、 S3アクセスライブラリsimples はまともに見える)といくつかの簡単な文字列操作を使用できます。

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

http://s3tools.org/s3cmd は適切に機能し、必要なURL構造のs3://形式をサポートします。 LinuxとWindowsでビジネスを行います。 pythonプログラム内から呼び出すためにネイティブAPIが必要な場合は、 http://code.google.com/p/boto/ がより良い選択です。

1
Joe Drumgoole

PythonでS3にアクセスするには、 Boto Python API )を使用できます。これは優れたライブラリです。Botoのインストールを実行すると、次のサンプルプログラムが機能します

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

詳細はこちら http://boto.cloudhackers.com/s3_tut.html#storing-data

1

試してみてください 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'
0