使用 Python 管理 Microsoft OneLake 中的文件和文件夹

本文介绍如何使用 Azure 存储 Python SDK 来管理 OneLake 中的文件和目录。 本演练介绍与使用 Python 管理 ADLS Gen2 中的目录和文件相同的内容,并强调了连接到 OneLake 时的差异。

先决条件

在启动项目之前,请确保具备以下先决条件:

  • Fabric 租户中具有参与者权限的工作区。
  • 工作区中的湖屋。 (可选)预加载数据以使用 Python 进行读取。

设置项目

从项目目录中,安装 Azure Data Lake Storage 和 Azure 标识客户端库的包。 OneLake 支持与 Azure Data Lake Storage (ADLS) Gen2 相同的 SDK,并支持由 azure-identity 包提供的 Microsoft Entra 身份验证。

pip install azure-storage-file-datalake azure-identity

接下来,将所需的导入语句添加到代码文件中:

import os
from azure.storage.filedatalake import (
    DataLakeServiceClient,
    DataLakeDirectoryClient,
    FileSystemClient
)
from azure.identity import DefaultAzureCredential

授权访问 OneLake

以下示例创建一个连接到 OneLake 的服务客户端,你可以使用 OneLake 为其他操作创建文件系统客户端。 为了向 OneLake 进行身份验证,此示例使用 DefaultAzureCredential 自动检测凭据并获取正确的身份验证令牌。 为 Azure SDK 提供凭据的常见方法包括使用 Azure 命令行接口中的“az login”命令或 Azure PowerShell 中的“Connect-AzAccount”cmdlet。

def get_service_client_token_credential(self, account_name) -> DataLakeServiceClient:
    account_url = f"https://{account_name}.dfs.fabric.microsoft.com"
    token_credential = DefaultAzureCredential()

    service_client = DataLakeServiceClient(account_url, credential=token_credential)

    return service_client

要详细了解如何使用 DefaultAzureCredential 授权访问数据,请参阅概述:使用 Azure SDK 向 Azure 验证 Python 应用的身份

使用目录

若要在 OneLake 中使用目录,请创建文件系统客户端和目录客户端。 可以使用此目录客户端执行各种操作,包括重命名、移动或列出路径(如以下示例所示)。 还可以在创建目录时使用 FileSystemClient.create_directory 方法创建目录客户端。

def create_file_system_client(self, service_client, file_system_name: str) : DataLakeServiceClient) -> FileSystemClient:
    file_system_client = service_client.get_file_system_client(file_system = file_system_name)
    return file_system_client

def create_directory_client(self, file_system_client : FileSystemClient, path: str) -> DataLakeDirectoryClient: directory_client 
    directory_client = file_system_client.GetDirectoryClient(path)
    return directory_client


def list_directory_contents(self, file_system_client: FileSystemClient, directory_name: str):
    paths = file_system_client.get_paths(path=directory_name)

    for path in paths:
        print(path.name + '\n')

上传文件

可以使用 DataLakeFileClient.upload_data 方法将内容上传到新的或现有的文件。

def upload_file_to_directory(self, directory_client: DataLakeDirectoryClient, local_path: str, file_name: str):
    file_client = directory_client.get_file_client(file_name)

    with open(file=os.path.join(local_path, file_name), mode="rb") as data:
        file_client.upload_data(dataW, overwrite=True)

示例

下面的代码示例列出了 OneLake 中任何文件夹的目录内容。

#Install the correct packages first in the same folder as this file. 
#pip install azure-storage-file-datalake azure-identity

from azure.storage.filedatalake import (
    DataLakeServiceClient,
    DataLakeDirectoryClient,
    FileSystemClient
)
from azure.identity import DefaultAzureCredential

# Set your account, workspace, and item path here
ACCOUNT_NAME = "onelake"
WORKSPACE_NAME = "<myWorkspace>"
DATA_PATH = "<myLakehouse>.Lakehouse/Files/<path>"

def main():
    #Create a service client using the default Azure credential

    account_url = f"https://{ACCOUNT_NAME}.dfs.fabric.microsoft.com"
    token_credential = DefaultAzureCredential()
    service_client = DataLakeServiceClient(account_url, credential=token_credential)

    #Create a file system client for the workspace
    file_system_client = service_client.get_file_system_client(WORKSPACE_NAME)
    
    #List a directory within the filesystem
    paths = file_system_client.get_paths(path=DATA_PATH)

    for path in paths:
        print(path.name + '\n')

if __name__ == "__main__":
    main()

若要运行此示例,请将上述代码保存到文件 listOneLakeDirectory.py 中,然后在同一目录中运行以下命令。 请记得将工作区和路径替换为示例中自己的值。

python listOneLakeDirectory.py