本文介紹如何列舉指定儲存空間下(Bucket)的所有檔案(Object)、指定首碼的檔案、指定目錄下的檔案和子目錄等。
注意事項
僅Python SDK 2.12.0及以上版本支援使用GetBucketV2(ListObjectsV2)方法。
本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見OSS訪問網域名稱、資料中心、開放連接埠。
本文以從環境變數讀取存取憑證為例。如何配置訪問憑證,請參見配置訪問憑證。
本文以OSS網域名稱建立OSSClient為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見初始化。
要列舉檔案,您必須有
oss:ListObjects
許可權。具體操作,請參見為RAM使用者授權自訂的權限原則。
背景資訊
您可以調用GetBucket(ListObjects)或GetBucketV2(ListObjectsV2)介面,一次性列舉某個Bucket下最多1000個Object。您可以通過指定參數實現多種列舉功能,例如通過指定參數列舉指定起始位置後的所有檔案、列舉指定目錄下的檔案和子目錄、以及通過分頁列舉超過1000個Object。這兩個介面的主要區別如下:
使用GetBucket(ListObjects)介面列舉檔案時,預設返回owner資訊。
使用GetBucketV2(ListObjectsV2)介面列舉檔案時,需通過fetchOwner指定是否在返回結果中包含owner資訊。
說明對於開啟版本控制的Bucket,建議使用GetBucketV2(ListObjectsV2)介面列舉檔案。
以下分別介紹通過GetBucket(ListObjects)以及GetBucketV2(ListObjectsV2)方法列舉檔案時涉及的參數說明。
通過GetBucket(ListObjects)方法列舉檔案
GetBucket(ListObjects)涉及參數說明如下:
參數 | 描述 |
prefix | 本次查詢結果的首碼。 |
delimiter | 對檔案名稱進行分組的字元。 |
marker | 此次列舉檔案的起點。 |
通過GetBucketV2(ListObjectsV2)方法列舉檔案
GetBucketV2(ListObjectsV2)涉及參數說明如下:
參數 | 描述 |
prefix | 本次查詢結果的首碼。 |
delimiter | 對檔案名稱進行分組的字元。 |
startAfter | 此次列舉檔案的起點。 |
fetchOwner | 指定是否在返回結果中包含owner資訊。
|
列舉指定個數的檔案
通過GetBucket(ListObjects)方法列舉
通過GetBucket(ListObjects)方法列舉指定儲存空間下的10個檔案的範例程式碼如下。
ObjectIterator封裝了ListObjects介面,以迭代器的方式提供,方便您使用。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from itertools import islice
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 列舉Bucket下的10個檔案。
for b in islice(oss2.ObjectIterator(bucket), 10):
print(b.key)
通過GetBucketV2(ListObjectsV2)方法列舉檔案
通過GetBucketV2(ListObjectsV2)方法列舉指定儲存空間下的10個檔案的範例程式碼如下。
ObjectIteratorV2封裝了ListObjectsV2介面,以迭代器的方式提供,方便您使用。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from itertools import islice
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 列舉Bucket下的10個檔案。
for obj in islice(oss2.ObjectIteratorV2(bucket), 10):
print(obj.key)
列舉儲存空間下所有檔案
通過GetBucket(ListObjects)方法列舉
通過GetBucket(ListObjects)方法列舉指定儲存空間下所有檔案的範例程式碼如下。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 列舉Bucket下的所有檔案。
for obj in oss2.ObjectIterator(bucket):
print(obj.key)
通過GetBucketV2(ListObjectsV2)方法列舉檔案
僅列舉檔案,不返迴文件的owner資訊
通過GetBucketV2(ListObjectsV2)方法列舉指定儲存空間下所有檔案的範例程式碼如下。
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider()) # 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 endpoint = "https://oss-cn-hangzhou.aliyuncs.com" # 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數 region = "cn-hangzhou" # yourBucketName填寫儲存空間名稱。 bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region) # 列舉Bucket下的所有檔案。 for obj in oss2.ObjectIteratorV2(bucket): print(obj.key)
列舉檔案,並返迴文件的owner資訊
通過GetBucketV2(ListObjectsV2)方法列舉指定儲存空間下所有檔案,並通過指定fetch_owner參數返迴文件的owner資訊的完整範例程式碼如下。
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider()) # 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 endpoint = "https://oss-cn-hangzhou.aliyuncs.com" # 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數 region = "cn-hangzhou" # yourBucketName填寫儲存空間名稱。 bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region) # 列舉Bucket下的所有檔案,並通過指定fetch_owner參數返回owner資訊。 for obj in oss2.ObjectIteratorV2(bucket, fetch_owner=True): print(obj.key) print('file owner display name: ' + obj.owner.display_name) print('file owner id: ' + obj.owner.id)
列舉指定首碼的所有檔案
假設儲存空間中有4個檔案: oss.jpg、fun/test.jpg、fun/movie/001.avi、fun/movie/007.avi,正斜線(/)作為檔案夾的分隔字元。
通過GetBucket(ListObjects)方法列舉
通過GetBucket(ListObjects)方法列舉指定首碼的所有檔案的範例程式碼如下。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 列舉fun檔案夾下的所有檔案,包括子目錄下的檔案。
for obj in oss2.ObjectIterator(bucket, prefix='fun/'):
print(obj.key)
通過GetBucketV2(ListObjectsV2)方法列舉
通過GetBucketV2(ListObjectsV2)方法列舉指定首碼的所有檔案的範例程式碼如下。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 列舉fun檔案夾下的所有檔案,包括子目錄下的檔案。
for obj in oss2.ObjectIteratorV2(bucket, prefix='fun/'):
print(obj.key)
列舉指定起始位置後的所有檔案
通過GetBucket(ListObjects)方法列舉
通過設定marker參數可以指定列舉的起始位置,OSS將會返回字串marker的字典序後的所有檔案。假設儲存空間中包含4個檔案,分別為x1.txt、x2.txt、z1.txt和z2.txt。
通過GetBucket(ListObjects)方法列舉指定起始位置後的所有檔案的範例程式碼如下。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 列舉指定字串之後的所有檔案。即使儲存空間中存在marker的同名object,返回結果中也不會包含這個object。
for obj in oss2.ObjectIterator(bucket, marker="x2.txt"):
print(obj.key)
通過GetBucketV2(ListObjectsV2)方法列舉
通過設定start_after參數可以指定列舉的起始位置,OSS將會返回字串start_after的字典序後的所有檔案。假設儲存空間中包含4個檔案,分別為x1.txt、x2.txt、z1.txt和z2.txt。
通過GetBucketV2(ListObjectsV2)方法列舉指定起始位置後的所有檔案的範例程式碼如下。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# 填寫Bucket名稱,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 列舉指定字串之後的所有檔案。即使儲存空間中存在start_after的同名object,返回結果中也不會包含這個object。
for obj in oss2.ObjectIteratorV2(bucket, start_after="x2.txt"):
print(obj.key)
列舉指定目錄下的檔案和子目錄
OSS沒有檔案夾的概念,所有元素都是以檔案來儲存。建立檔案夾本質上來說是建立了一個大小為0並以正斜線(/)結尾的檔案。這個檔案可以被上傳和下載,控制台會對以正斜線(/)結尾的檔案以檔案夾的方式展示。
通過delimiter和prefix兩個參數可以類比檔案夾功能:
如果設定prefix為某個檔案夾名稱,則會列舉以此prefix開頭的檔案,即該檔案夾下所有的檔案和子檔案夾(目錄)。
如果再設定delimiter為正斜線(/),則只列舉該檔案夾下的檔案和子檔案夾(目錄)名稱,子檔案夾下的檔案和檔案夾不顯示。
通過GetBucket(ListObjects)方法列舉
通過GetBucket(ListObjects)方法列舉指定目錄下的檔案和子目錄的範例程式碼如下。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 列舉fun檔案夾下的檔案與子檔案夾名稱,不列舉子檔案夾下的檔案。
for obj in oss2.ObjectIterator(bucket, prefix='fun/', delimiter ='/'):
# 通過is_prefix方法判斷obj是否為檔案夾。(請注意判斷是否為檔案夾需要配置delimiter和prefix來完成類比檔案夾功能)
if obj.is_prefix(): # 判斷obj為檔案夾。
print('directory: ' + obj.key)
else: # 判斷obj為檔案。
print('file: ' + obj.key)
通過GetBucketV2(ListObjectsV2)方法列舉
通過GetBucketV2(ListObjectsV2)方法列舉指定目錄下的檔案和子目錄的範例程式碼如下。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 列舉fun檔案夾下的檔案與子檔案夾名稱,不列舉子檔案夾下的檔案。如果不需要返回owner資訊可以不設定fetch_owner參數。
for obj in oss2.ObjectIteratorV2(bucket, prefix = 'fun/', delimiter = '/', start_after='fun/', fetch_owner=True):
# 通過is_prefix方法判斷obj是否為檔案夾。
if obj.is_prefix(): # 判斷obj為檔案夾。
print('directory: ' + obj.key)
else: # 判斷obj為檔案。
print('file: ' + obj.key)
print('file owner display name: ' + obj.owner.display_name)
print('file owner id: ' + obj.owner.id)
擷取指定目錄下的檔案大小
通過GetBucket(ListObjects)方法列舉
通過GetBucket(ListObjects)方法列舉指定目錄下的檔案大小的範例程式碼如下。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
def CalculateFolderLength(bucket, folder):
length = 0
for obj in oss2.ObjectIterator(bucket, prefix=folder):
length += obj.size
return length
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
for obj in oss2.ObjectIterator(bucket, delimiter='/'):
if obj.is_prefix(): # 判斷obj為檔案夾。
length = CalculateFolderLength(bucket, obj.key)
print('directory: ' + obj.key + ' length:' + str(length) + "Byte.")
else: # 判斷obj為檔案。
print('file:' + obj.key + ' length:' + str(obj.size) + "Byte.")
通過GetBucketV2(ListObjectsV2)方法列舉檔案
通過GetBucketV2(ListObjectsV2)方法列舉指定目錄下的檔案大小的範例程式碼如下。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
def CalculateFolderLength(bucket, folder):
length = 0
for obj in oss2.ObjectIteratorV2(bucket, prefix=folder):
length += obj.size
return length
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
for obj in oss2.ObjectIteratorV2(bucket, delimiter='/'):
if obj.is_prefix(): # 判斷obj為檔案夾。
length = CalculateFolderLength(bucket, obj.key)
print('directory: ' + obj.key + ' length:' + str(length) + "Byte.")
else: # 判斷obj為檔案。
print('file:' + obj.key + ' length:' + str(obj.size) + "Byte.")
相關文檔
關於列舉檔案的完整範例程式碼,請參見GitHub樣本。
關於列舉檔案的API介面說明,請參見GetBucket (ListObjects)和ListObjectsV2(GetBucketV2)。