Python列舉文件
本文介紹如何在開啟版本控制狀態(tài)下列舉存儲空間下(Bucket)的所有文件(Object)、指定個數(shù)的文件、指定前綴的文件等。
注意事項
本文以華東1(杭州)外網(wǎng)Endpoint為例。如果您希望通過與OSS同地域的其他阿里云產(chǎn)品訪問OSS,請使用內(nèi)網(wǎng)Endpoint。關(guān)于OSS支持的Region與Endpoint的對應(yīng)關(guān)系,請參見訪問域名和數(shù)據(jù)中心。
本文以從環(huán)境變量讀取訪問憑證為例。如何配置訪問憑證,請參見配置訪問憑證。
本文以O(shè)SS域名新建OSSClient為例。如果您希望通過自定義域名、STS等方式新建OSSClient,請參見初始化。
要列舉文件,您必須有
oss:ListObjectVersions
權(quán)限。具體操作,請參見為RAM用戶授權(quán)自定義的權(quán)限策略。
列舉Bucket中所有Object的信息
以下代碼用于列舉指定Bucket中包括刪除標(biāo)記(Delete Marker)在內(nèi)的所有Object的版本信息:
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填寫存儲空間名稱。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')
# 開啟Bucket版本控制后,調(diào)用list_object_versions接口返回不同版本的Object信息。
# 列舉Bucket中包括刪除標(biāo)記(Delete Marker)在內(nèi)的所有Object的版本信息。
result = bucket.list_object_versions()
# 列舉所有Object的版本信息。
next_key_marker = None
next_versionid_marker = None
while True:
result = bucket.list_object_versions(key_marker=next_key_marker, versionid_marker=next_versionid_marker)
# 查看列舉Object的版本信息。
for version_info in result.versions:
print('version_info.versionid:', version_info.versionid)
print('version_info.key:', version_info.key)
print('version_info.is_latest:', version_info.is_latest)
# 查看列舉刪除標(biāo)記的版本信息。
for del_maker_Info in result.delete_marker:
print('del_maker.key:', del_maker_Info.key)
print('del_maker.versionid:', del_maker_Info.versionid)
print('del_maker.is_latest:', del_maker_Info.is_latest)
is_truncated = result.is_truncated
# 查看列舉結(jié)果是否完整。如果結(jié)果不完整,則繼續(xù)羅列。如果結(jié)果已完整,則退出循環(huán)。
if is_truncated:
next_key_marker = result.next_key_marker
next_versionid_marker = result.next_versionid_marker
else:
break
列舉指定前綴Object的版本信息
以下代碼用于列舉指定前綴Object的版本信息:
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填寫存儲空間名稱。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')
# 開啟Bucket版本控制后,調(diào)用list_object_versions接口返回不同版本的Object信息。
# 列舉Bucket中包括刪除標(biāo)記(Delete Marker)在內(nèi)的所有Object的版本信息。
result = bucket.list_object_versions()
# 指定列舉以test-為前綴的Object的版本信息。
prefix = 'test-'
next_key_marker = None
next_versionid_marker = None
while True:
result = bucket.list_object_versions(prefix=prefix, key_marker=next_key_marker, versionid_marker=next_versionid_marker)
# 查看列舉的Object版本信息。
for version_info in result.versions:
print('version_info.versionid:', version_info.versionid)
print('version_info.key:', version_info.key)
print('version_info.is_latest:', version_info.is_latest)
# 查看列舉的刪除標(biāo)記版本信息。
for del_maker_Info in result.delete_marker:
print('del_maker.key:', del_maker_Info.key)
print('del_maker.versionid:', del_maker_Info.versionid)
print('del_maker.is_latest:', del_maker_Info.is_latest)
is_truncated = result.is_truncated
# 查看列舉結(jié)果是否完整。如果結(jié)果不完整,則繼續(xù)羅列。如果結(jié)果已完整,則退出循環(huán)。
if is_truncated:
next_key_marker = result.next_key_marker
next_versionid_marker = result.next_versionid_marker
else:
break
列舉指定個數(shù)Object的版本信息
以下代碼用于列舉指定個數(shù)Object的版本信息:
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填寫存儲空間名稱。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')
# 開啟Bucket版本控制后,調(diào)用list_object_versions接口返回不同版本的Object信息。
# 列舉Bucket中包括刪除標(biāo)記(Delete Marker)在內(nèi)的所有Object的版本信息。
result = bucket.list_object_versions()
# 指定本次最多返回200個結(jié)果。
max_keys = 200
result = bucket.list_object_versions(max_keys=max_keys)
# 查看列舉的Object版本信息。
for version_info in result.versions:
print('version_info.versionid:', version_info.versionid)
print('version_info.key:', version_info.key)
print('version_info.is_latest:', version_info.is_latest)
# 查看列舉的Object刪除標(biāo)記的版本信息。
for del_maker_Info in result.delete_marker:
print('del_maker.key:', del_maker_Info.key)
print('del_maker.versionid:', del_maker_Info.versionid)
print('del_maker.is_latest:', del_maker_Info.is_latest)
# 查看列舉結(jié)果是否有截斷。
# 由于指定本次列舉最多返回200個結(jié)果,若Bucket中Object的個數(shù)超過200,則列舉結(jié)果存在截斷,即is_truncated為True。若Bucket中Object的個數(shù)少于200,則列舉結(jié)果沒有截斷,即is_truncated為False。
print('is truncated', result.is_truncated)
文件夾功能
OSS沒有文件夾的概念,所有元素都是以文件來存儲。創(chuàng)建文件夾本質(zhì)上來說是創(chuàng)建了一個大小為0并以正斜線(/)結(jié)尾的文件。這個文件可以被上傳和下載,控制臺會對以正斜線(/)結(jié)尾的文件以文件夾的方式展示。
通過delimiter和prefix兩個參數(shù)可以模擬文件夾功能:
如果設(shè)置prefix為某個文件夾名稱,則會列舉以此prefix開頭的文件,即該文件夾下所有的文件和子文件夾(目錄)均顯示為Object。
如果在設(shè)置了prefix的情況下,將delimiter設(shè)置為正斜線(/),則只列舉該文件夾下的文件和子文件夾(目錄),該文件夾下的子文件夾(目錄)顯示為CommonPrefixes,子文件夾下的文件和文件夾不顯示。
假設(shè)存儲空間(examplebucket)中包含文件oss.jpg、fun/test.jpg、fun/movie/001.avi和fun/movie/007.txt,以正斜線(/)作為文件夾的分隔符。文件結(jié)構(gòu)如下:
examplebucket
└── oss.jpg
└── fun
└── test.jpg
└── movie
└── 001.avi
└── 007.txt
以下示例說明了如何通過模擬文件夾的方式列舉文件。
列舉根目錄下的Object的版本信息
以下代碼用于列舉根目錄下的Object的版本信息:
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # 填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 # yourBucketName填寫存儲空間名稱。 bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName') # 開啟Bucket版本控制后,調(diào)用list_object_versions接口返回不同版本的Object信息。 # 列舉Bucket中包括刪除標(biāo)記(Delete Marker)在內(nèi)的所有Object的版本信息。 result = bucket.list_object_versions() # 指定delimiter為正斜線(/)。 delimiter = "/" next_key_marker = None next_versionid_marker = None while True: result = bucket.list_object_versions(delimiter=delimiter, key_marker=next_key_marker, versionid_marker=next_versionid_marker) # 查看列舉的Object版本信息。 for version_info in result.versions: print('version_info.versionid:', version_info.versionid) print('version_info.key:', version_info.key) print('version_info.is_latest:', version_info.is_latest) # 查看列舉的刪除標(biāo)記版本信息。 for del_maker_Info in result.delete_marker: print('del_maker.key:', del_maker_Info.key) print('del_maker.versionid:', del_maker_Info.versionid) print('del_maker.is_latest:', del_maker_Info.is_latest) # 查看以正斜線(/)結(jié)尾的目錄名稱。 for common_prefix in result.common_prefix: print("common_prefix:", common_prefix) is_truncated = result.is_truncated # 查看列舉結(jié)果是否完整。如果結(jié)果不完整,則繼續(xù)羅列。如果結(jié)果已完整,則退出循環(huán)。 if is_truncated: next_key_marker = result.next_key_marker next_versionid_marker = result.next_versionid_marker else: break
返回結(jié)果:
('version_info.versionid:', 'CAEQEhiBgMCw8Y7FqBciIGIzMDE3MTEzOWRiMDRmZmFhMmRlMjljZWI0MWU4****') ('version_info.key:', 'oss.jpg') ('version_info.is_latest:', True) ('common_prefix:', 'fun/')
列舉目錄下的文件和子目錄
以下代碼用于列舉指定目錄下的文件和子目錄:
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # 填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 # yourBucketName填寫存儲空間名稱。 bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName') # 開啟Bucket版本控制后,調(diào)用list_object_versions接口返回不同版本的Object信息。 # 列出Bucket中包括刪除標(biāo)記(Delete Marker)在內(nèi)的所有Object的版本信息。 result = bucket.list_object_versions() # 指定delimiter為正斜線(/),prefix為fun/。 prefix = "fun/" delimiter = "/" next_key_marker = None next_versionid_marker = None while True: result = bucket.list_object_versions(prefix=prefix, delimiter=delimiter, key_marker=next_key_marker, versionid_marker=next_versionid_marker) # 查看列舉的Object版本信息。 for version_info in result.versions: print('version_info.versionid:', version_info.versionid) print('version_info.key:', version_info.key) print('version_info.is_latest:', version_info.is_latest) # 查看列舉的刪除標(biāo)記的版本信息。 for del_maker_Info in result.delete_marker: print('del_maker.key:', del_maker_Info.key) print('del_maker.versionid:', del_maker_Info.versionid) print('del_maker.is_latest:', del_maker_Info.is_latest) # 查看以正斜線(/)結(jié)尾的文件夾名稱。 for common_prefix in result.common_prefix: print("common_prefix:", common_prefix) is_truncated = result.is_truncated # 查看列舉結(jié)果是否完整。如果結(jié)果不完整,則繼續(xù)羅列。如果結(jié)果已完整,則退出循環(huán)。 if is_truncated: next_key_marker = result.next_key_marker next_versionid_marker = result.next_versionid_marker else: break
返回結(jié)果:
('version_info.versionid:', 'CAEQFRiBgMCh9JDkrxciIGE3OTNkYzFhYTc2YzQzOTQ4Y2MzYjg2YjQ4ODg*****') ('version_info.key:', 'fun/test.jpg') ('version_info.is_latest:', True) ('commonPrefix:', 'fun/movie/')
相關(guān)文檔
關(guān)于列舉文件的API接口說明,請參見ListObjectVersions(GetBucketVersions)。