Python SDK を使用すると、オブジェクトの一覧表示、削除とコピー、オブジェクト情報の表示、およびオブジェクトメタデータの変更ができます。
リストオブジェクト
Python SDK には、オブジェクトのリストとマルチパートアップロードを実行する一連のイテレータが用意されています。
シンプルリスト
次のコードは、バケット内の 10 個のファイルをリストしています。
# -*- coding: utf-8 -*-
import oss2
from itertools import islice
auth = oss2.Auth ('Your AccessKeyID', 'Your AccessKeySecret')
bucket = oss2.Bucket (auth, 'Your endpoint', 'your bucket name')
for b in islice(oss2.ObjectIterator(bucket), 10):
print(b.key)
接頭辞でオブジェクトを一覧表示する
次のコードでは、接頭辞が「img-」のすべてのオブジェクトのみがリストされています。
for obj in oss2.ObjectIterator(bucket, prefix='img-'):
print(obj.key)
フォルダをシミュレートする
OSS にはフォルダやディレクトリがないため、OSS 上のバケットはフラットな構造になっています。オブジェクト名に「/」を追加して、フォルダを刺激することができます。オブジェクトをリストするときは、 ‘delimiter’パラメータ(ディレクトリ区切り文字)を「/」に設定し、OSS は、それがフォルダであるかどうかを “CommonPrefix”であるかどうかによって判別します。詳細は、オブジェクトの一覧表示 を参照してください。
次のコードは、「ルートディレクトリ」の下にあるすべてのコンテンツをリストしています。
for obj in oss2.ObjectIterator(bucket, delimiter='/'):
if obj.is_prefix(): # Folder
print('directory: ' + obj.key)
else: # Object
print('file: ' + obj.key)
注意フォルダリストの取得は効率が悪く、お勧めできません。
オブジェクトが存在するかどうかを識別する
‘object_exists’を使用して、オブジェクトが存在するかどうかを判断できます。戻り値が ‘true’の場合、オブジェクトが存在することを示します。戻り値が’false’の場合、オブジェクトが存在しないことを示します。
exist = bucket.object_exists('remote.txt')
if exist:
print('object exist')
else:
print('object not eixst')
オブジェクトを削除する
次のコードは、単一のオブジェクトを削除します。
bucket.delete_object('remote.txt')
複数のオブジェクト(最大 1,000 個のオブジェクト)を削除できます。次のコードは、3 つのオブジェクトを削除し、正常に削除されたオブジェクトの名前を出力します。
result = bucket.batch_delete_objects(['a.txt', 'b.txt', 'c.txt'])
print('\n'.join(result.deleted_keys))
オブジェクトをコピーする
次のコードは、src-bucket というバケットの source.txt の内容を現在のバケットの target.txt オブジェクトにコピーします。
bucket.copy_object('src-bucket', 'source.txt', 'target.txt')
ラージオブジェクトをコピーする
オブジェクトが大きい場合は、オブジェクトサイズが大きいためにタイムアウトを避けるために、マルチパートコピーをお勧めします。マルチパートアップロードと同様に、マルチパートコピーは 3 つのステップで完了します:
- 初期化(Bucket.init_multipart_upload):アップロード ID を取得する
- 部品をコピーする(Bucket.upload_part_copy):ソースオブジェクトの各部分がターゲットオブジェクトの一部としてコピーされる
- マルチパートコピーの完了(Bucket.complete_multipart_copy):マルチパートコピーが完了してターゲットオブジェクトを生成する
以下に例を示します。
from oss2.models import PartInfo
from oss2 import determine_part_size
src_key = 'remote.txt'
dst_key = 'remote-dst.txt'
bucket.put_object(src_key, 'a' * (1024 * 1024 + 100))
total_size = bucket.head_object(src_key).content_length
part_size = determine_part_size(total_size, preferred_size=100 * 1024)
# Part initialization
upload_id = bucket.init_multipart_upload(dst_key).upload_id
parts = []
# Copy parts one by one
part_number = 1
offset = 0
while offset < total_size:
num_to_upload = min(part_size, total_size - offset)
byte_range = (offset, offset + num_to_upload - 1)
result = bucket.upload_part_copy(bucket.bucket_name, src_key, byte_range,
dst_key, upload_id, part_number)
parts.append(PartInfo(part_number, result.etag))
offset += num_to_upload
part_number += 1
# Complete multipart upload
bucket.complete_multipart_upload(dst_key, upload_id, parts)
オブジェクトのメタデータを変更する
次のコードは、カスタムオブジェクトのメタデータを変更します。
bucket.update_object_meta('story.txt', {'x-oss-meta-author': 'O. Henry'})
bucket.update_object_meta('story.txt', {'x-oss-meta-price': '100 dollar'})
カスタムオブジェクトメタデータの以前の値(「x-oss-meta-」が付いた HTTP ヘッダー)は、カスタムオブジェクトのメタデータが呼び出されるたびに上書きされます。
上記の例では、カスタムオブジェクトメタデータ「x-oss-meta-author」は、2 回目の呼び出しで削除されます。
Content-Type などのその他の情報も変更できます。
bucket.update_object_meta('story.txt', {'Content-Type': 'text/plain'})
この呼び出しが Content-Type を変更しただけでなく、以前のカスタムオブジェクトのメタデータもクリアしたことに注意してください。
オブジェクトアクセス許可を表示する
print(bucket.get_object_acl('story.txt').acl)
注意:
このオブジェクトには、デフォルト(デフォルト値)、プライベート(private-read-write)、パブリック・リード(public-read と private-write)、パブリック・リード・ライト(public-read-write)の 4 つのアクセス ACL があります。より詳細な説明は RAM にあります。
オブジェクトアクセス権を設定する
オブジェクトのアクセス許可を public-read に設定します。
bucket.put_object_acl('story.txt', oss2.OBJECT_ACL_PUBLIC_READ)
注意:このオブジェクトには、デフォルト(デフォルト値)、プライベート(private-read-write)、パブリック・リード(パブpublic-readとprivate-write)、パブリック・リード・ライト(public-read-write)の 4 つのアクセス ACL があります。それらは、それぞれ oss2.OBJECT_ACL_DEFAULT、oss2.OBJECT_ACL_PRIVATE、oss2.OBJECT_ACL_PUBLIC_READ および oss2.OBJECT_ACL_PUBLIC_READ_WRITE にマップされます。