本文介绍了如何使用 Python 在具有分层命名空间的存储帐户中创建和管理目录与文件。

若要了解如何获取、设置和更新目录与文件的访问控制列表 (ACL),请参阅 使用 Python 管理 Azure Data Lake Storage Gen2 中的 ACL

包(Python 包索引) | 示例 | API 参考 | Gen1 到 Gen2 的映射 | 提供反馈

  • Azure 订阅。 请参阅 获取 Azure 免费试用版

  • 一个已启用 分层命名空间 的存储帐户。 按 这些 说明创建一个。

    本部分逐步指导你准备一个项目,使其与适用于 Python 的 Azure Data Lake Storage 客户端库配合使用。

    从项目目录中,使用 pip install 命令安装 Azure Data Lake Storage 和 Azure 标识客户端库的包。 与 Azure 服务的无密码连接需要 azure-identity 包。

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

    然后打开代码文件并添加必要的 import 语句。 在此示例中,我们将以下内容添加到 .py 文件:

    import os, uuid, sys
    from azure.identity import DefaultAzureCredential
    from azure.storage.filedatalake import DataLakeServiceClient
    from azure.core._match_conditions import MatchConditions
    from azure.storage.filedatalake._models import ContentSettings
    

    授权访问并连接到数据资源

    若要使用本文中的代码示例,需创建一个表示存储帐户的授权 DataLakeServiceClient 实例。 你可以使用 Azure Active Directory (Azure AD)、帐户访问密钥或共享访问签名 (SAS) 来授权 DataLakeServiceClient

    Azure AD SAS 令牌

    可以使用适用于 Python 的 Azure 标识客户端库,通过 Azure AD 对应用程序进行身份验证。

    创建 DataLakeServiceClient 类的实例并传入 DefaultAzureCredential 对象。

    def initialize_storage_account_ad(storage_account_name): global service_client default_credential = DefaultAzureCredential() service_client = DataLakeServiceClient(account_url="{}://{}.dfs.core.windows.net".format( "https", storage_account_name), credential=default_credential) except Exception as e: print(e)

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

    若要使用共享访问签名 (SAS) 令牌,请提供字符串形式的令牌并初始化 DataLakeServiceClient 对象。 如果帐户 URL 包含 SAS 令牌,请省略凭据参数。

    def initialize_storage_account_sas(storage_account_name, sas_token: str): global service_client # The SAS token string can be passed in as credential param or appended to the account URL service_client = DataLakeServiceClient(account_url="{}://{}.dfs.core.windows.net".format( "https", storage_account_name), credential=sas_token) except Exception as e: print(e)

    若要详细了解如何生成和管理 SAS 令牌,请参阅以下文章:

  • 使用共享访问签名 (SAS) 授予对 Azure 存储资源的有限访问权限
  • 可以使用帐户访问密钥(共享密钥)授权访问数据。 此示例将创建使用帐户密钥授权的 DataLakeServiceClient 实例。

    def initialize_storage_account(storage_account_name, storage_account_key): global service_client service_client = DataLakeServiceClient(account_url="{}://{}.dfs.core.windows.net".format( "https", storage_account_name), credential=storage_account_key) except Exception as e: print(e)

    不建议使用共享密钥进行授权,因为它可能不太安全。 为获得最佳安全性,请禁用存储帐户的共享密钥授权,如阻止对 Azure 存储帐户进行共享密钥授权中所述。

    对访问密钥和连接字符串的使用应限于不访问生产数据或敏感数据的初始概念证明应用或开发原型。 否则,在向 Azure 资源进行身份验证时,应始终优先使用 Azure SDK 中提供的基于令牌的身份验证类。

    Microsoft 建议客户端使用 Azure AD 或共享访问签名 (SAS) 来授权访问 Azure 存储中的数据。 要了解详细信息,请参阅授权数据访问操作

    容器充当文件的文件系统。 可以通过调用 DataLakeServiceClient.create_file_system 方法来创建一个。

    此示例创建一个名为 my-file-system 的容器。

    def create_file_system(): global file_system_client file_system_client = service_client.create_file_system(file_system="my-file-system") except Exception as e: print(e)

    通过调用 FileSystemClient.create_directory 方法来创建目录引用。

    此示例将名为 my-directory 的目录添加到容器中。

    def create_directory(): file_system_client.create_directory("my-directory") except Exception as e: print(e)

    重命名或移动目录

    通过调用 DataLakeDirectoryClient.rename_directory 方法来重命名或移动目录。 以参数形式传递所需目录的路径。

    此示例将某个子目录重命名为名称 my-directory-renamed

    def rename_directory(): file_system_client = service_client.get_file_system_client(file_system="my-file-system") directory_client = file_system_client.get_directory_client("my-directory") new_dir_name = "my-directory-renamed" directory_client.rename_directory(new_name=directory_client.file_system_name + '/' + new_dir_name) except Exception as e: print(e)

    通过调用 DataLakeDirectoryClient.delete_directory 方法来删除目录。

    此示例删除名为 my-directory 的目录。

    def delete_directory(): file_system_client = service_client.get_file_system_client(file_system="my-file-system") directory_client = file_system_client.get_directory_client("my-directory") directory_client.delete_directory() except Exception as e: print(e)

    将文件上传到目录

    首先,通过创建 DataLakeFileClient 类的实例,在目标目录中创建文件引用。 通过调用 DataLakeFileClient.append_data 方法上传文件。 确保通过调用 DataLakeFileClient.flush_data 方法完成上传。

    此示例将文本文件上传到名为 my-directory 的目录。

    def upload_file_to_directory(): file_system_client = service_client.get_file_system_client(file_system="my-file-system") directory_client = file_system_client.get_directory_client("my-directory") file_client = directory_client.create_file("uploaded-file.txt") local_file = open("C:\\file-to-upload.txt",'r') file_contents = local_file.read() file_client.append_data(data=file_contents, offset=0, length=len(file_contents)) file_client.flush_data(len(file_contents)) except Exception as e: print(e)

    如果文件很大,则代码必须多次调用 DataLakeFileClientappend_data 方法。 请考虑改用 upload_data 方法。 这样就可以在单个调用中上传整个文件。

    将大型文件上传到目录

    使用 DataLakeFileClient.upload_data 方法上传大型文件,无需多次调用 DataLakeFileClient.append_data 方法 。

    def upload_file_to_directory_bulk(): file_system_client = service_client.get_file_system_client(file_system="my-file-system") directory_client = file_system_client.get_directory_client("my-directory") file_client = directory_client.get_file_client("uploaded-file.txt") local_file = open("C:\\file-to-upload.txt",'r') file_contents = local_file.read() file_client.upload_data(file_contents, overwrite=True) except Exception as e: print(e)

    从目录下载

    打开用于写入的本地文件。 然后,创建一个 DataLakeFileClient 实例,该实例表示要下载的文件。 调用 DataLakeFileClient.download_file,以便从文件读取字节,然后将这些字节写入本地文件。

    def download_file_from_directory(): file_system_client = service_client.get_file_system_client(file_system="my-file-system") directory_client = file_system_client.get_directory_client("my-directory") local_file = open("C:\\file-to-download.txt",'wb') file_client = directory_client.get_file_client("uploaded-file.txt") download = file_client.download_file() downloaded_bytes = download.readall() local_file.write(downloaded_bytes) local_file.close() except Exception as e: print(e)

    列出目录内容

    通过调用 FileSystemClient.get_paths 方法列出目录内容,然后枚举结果。

    此示例输出名为 my-directory 的目录中的每个子目录和文件的路径。

    def list_directory_contents(): file_system_client = service_client.get_file_system_client(file_system="my-file-system") paths = file_system_client.get_paths(path="my-directory") for path in paths: print(path.name + '\n') except Exception as e: print(e)
  • API 参考文档
  • Azure 文件 Data Lake Storage 客户端库(Python 包索引)
  • Gen1 到 Gen2 的映射
  •