全部產品
Search
文件中心

Object Storage Service:Python列舉檔案

更新時間:Oct 25, 2024

本文介紹如何列舉指定儲存空間下(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資訊。

  • true:表示返回結果中包含owner資訊。

  • false:表示返回結果中不包含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.")

相關文檔