37

私は boto と python と amazon s3 を使用しています。

私が使用する場合

[key.name for key in list(self.bucket.list())]

次に、すべてのファイルのすべてのキーを取得します。

mybucket/files/pdf/abc.pdf
mybucket/files/pdf/abc2.pdf
mybucket/files/pdf/abc3.pdf
mybucket/files/pdf/abc4.pdf
mybucket/files/pdf/new/
mybucket/files/pdf/new/abc.pdf
mybucket/files/pdf/2011/

最善の方法は何ですか

1. either get all folders from s3
2. or from that list just remove the file from the last and get the unique keys of folders

私はこのようにしようと考えています

set([re.sub("/[^/]*$","/",path) for path in mylist]
4

9 に答える 9

20

j1mによって提案されたコメントアプローチの1つで指摘されているように、プレフィックスオブジェクトを返します。名前/パスの後にいる場合は、変数nameを使用できます。例えば:

import boto
import boto.s3

conn = boto.s3.connect_to_region('us-west-2')
bucket = conn.get_bucket(your_bucket)

folders = bucket.list("","/")
for folder in folders:
    print folder.name
于 2015-07-29T14:16:59.363 に答える
18

私はpythonやbotoを知らないので、これは不完全な答えになるでしょうが、質問の根底にある概念についてコメントしたいと思います。

他のポスターの 1 つは正しかった: S3 にはディレクトリの概念はありません。フラットなキーと値のペアのみがあります。多くのアプリケーションは、特定の区切り文字がディレクトリ エントリを示すふりをします。たとえば、「/」または「\」。一部のアプリでは、「ディレクトリ」が空になった場合でもリストの結果に表示されるように、ダミー ファイルを配置するところまで行っています。

常にバケット全体を取得して、ローカルでフィルタリングを行う必要はありません。S3 には区切りリストの概念があり、パス区切り文字 (「/」、「\」、「|」、「foobar」など) と見なすものを指定すると、S3 は仮想結果を返します。欲しいです。

http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html (区切りヘッダーを見てください。)

この API は、1 レベルのディレクトリを取得します。あなたの例にあった場合:

mybucket/files/pdf/abc.pdf
mybucket/files/pdf/abc2.pdf
mybucket/files/pdf/abc3.pdf
mybucket/files/pdf/abc4.pdf
mybucket/files/pdf/new/
mybucket/files/pdf/new/abc.pdf
mybucket/files/pdf/2011/

そして、接頭辞 "" と区切り文字 "/" を含む LIST を渡すと、結果が得られます。

mybucket/files/

プレフィックス「mybucket/files/」とデリミタ「/」を使用して LIST を渡すと、結果が得られます。

mybucket/files/pdf/

また、プレフィックス「mybucket/files/pdf/」とデリミタ「/」を使用して LIST を渡すと、結果が得られます。

mybucket/files/pdf/abc.pdf
mybucket/files/pdf/abc2.pdf
mybucket/files/pdf/abc3.pdf
mybucket/files/pdf/abc4.pdf
mybucket/files/pdf/new/
mybucket/files/pdf/2011/

結果セットから pdf ファイル自体を削除したい場合は、その時点で自分で行う必要があります。

python/boto でこれを行う方法はわかりません。うまくいけば、通過する方法があります。

于 2013-07-01T03:36:56.217 に答える
1

boto インターフェイスを使用すると、バケットの内容を一覧表示し、エントリのプレフィックスを指定できます。そうすれば、通常のファイルシステムのディレクトリになるもののエントリを持つことができます:

import boto
AWS_ACCESS_KEY_ID = '...'
AWS_SECRET_ACCESS_KEY = '...'

conn = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
bucket = conn.get_bucket()
bucket_entries = bucket.list(prefix='/path/to/your/directory')

for entry in bucket_entries:
    print entry
于 2013-07-01T04:09:42.963 に答える