如何通过ADF将Azure Blob不同文件夹下同名最新文件移至单文件夹
实现Azure Blob存储同名文件最新版本归集到单一文件夹
前提准备
首先安装Azure Blob存储的Python SDK:
pip install azure-storage-blob
核心代码实现
以下代码会扫描指定路径下所有文件,按文件名分组后筛选出最新修改的版本,将其移动到目标文件夹(移动操作通过复制+删除源文件实现,Azure Blob无原生移动API):
from azure.storage.blob import BlobServiceClient import time # 替换为你的存储账户信息 CONNECTION_STRING = "你的Azure存储账户连接字符串" CONTAINER_NAME = "目标容器名称" SOURCE_PREFIX = "Main_folder/Folder_X/" # 要扫描的根路径(所有子文件夹都会被遍历) TARGET_BASE_PATH = "Main_folder/" # 最终文件存放的目标路径 # 初始化客户端 blob_service_client = BlobServiceClient.from_connection_string(CONNECTION_STRING) container_client = blob_service_client.get_container_client(CONTAINER_NAME) # 按文件名分组,存储每个文件的所有版本信息 file_version_map = {} # 遍历所有符合前缀的Blob for blob in container_client.list_blobs(name_starts_with=SOURCE_PREFIX): file_name = blob.name.split("/")[-1] if file_name not in file_version_map: file_version_map[file_name] = [] file_version_map[file_name].append({ "last_modified": blob.last_modified, "blob_path": blob.name }) # 处理每个文件的版本,移动最新版到目标路径 for filename, versions in file_version_map.items(): # 按修改时间倒序排序,取第一个即为最新版本 latest_version = sorted(versions, key=lambda x: x["last_modified"], reverse=True)[0] source_blob_path = latest_version["blob_path"] target_blob_path = f"{TARGET_BASE_PATH}{filename}" # 复制最新Blob到目标位置 source_blob_client = container_client.get_blob_client(source_blob_path) target_blob_client = container_client.get_blob_client(target_blob_path) # 启动复制任务 copy_operation = target_blob_client.start_copy_from_url(source_blob_client.url) # 等待复制完成(大文件需适当延长等待间隔) while target_blob_client.get_blob_properties().copy.status == "pending": time.sleep(2) # 删除源Blob(若需保留源文件可注释此步骤) source_blob_client.delete_blob() print(f"完成:最新版 {filename} 已从 {source_blob_path} 移动到 {target_blob_path}")
关键说明
- 权限要求:确保执行代码的身份拥有Blob存储的
Contributor或更高权限 - 覆盖逻辑:若目标路径已存在同名文件,复制操作会直接覆盖,如需避免覆盖可在复制前检查目标Blob是否存在
- 时区注意:Blob的
last_modified属性为UTC时间,若需与本地时间对比,需自行做时区转换 - 大文件处理:针对大文件,可考虑使用异步复制或增加等待时间,避免复制未完成就执行删除操作
内容的提问来源于stack exchange,提问作者techlock77
相关产品推荐
相关产品推荐

