Verwenden von Python zum Verwalten von Verzeichnissen und Dateien in Azure Data Lake Storage Gen2

In diesem Artikel erfahren Sie, wie Sie mithilfe von Python Verzeichnisse und Dateien in Speicherkonten erstellen und verwalten, die über einen hierarchischen Namespace verfügen.

Informationen zum Abrufen, Festlegen und Aktualisieren der Zugriffssteuerungslisten (Access Control Lists, ACLs) von Verzeichnissen und Dateien finden Sie unter Verwenden von Python zum Verwalten von Zugriffssteuerungslisten in Azure Data Lake Storage Gen2.

PyPi-Paket | Beispiele | API-Referenz | Zuordnung von Gen1 zu Gen2 | Feedback geben

Voraussetzungen

Einrichten des Projekts

In diesem Abschnitt wird beschrieben, wie Sie ein Projekt zur Arbeit mit der Azure Data Lake Storage-Clientbibliothek für Python vorbereiten.

Installieren Sie aus Ihrem Projektverzeichnis mithilfe des Befehls pip install die Pakete für die Azure Data Lake Storage- und Azure Identity-Clientbibliotheken. Das azure-identity-Paket wird für kennwortlose Verbindungen mit Azure-Diensten benötigt.

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

Öffnen Sie dann Ihre Codedatei, und fügen Sie die erforderlichen Importanweisungen hinzu. In diesem Beispiel fügen Sie Ihrer PY-Datei Folgendes hinzu:

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

Hinweis

Der Multiprotokollzugriff auf Data Lake Storage ermöglicht Anwendungen die Verwendung von Blob-APIs und Data Lake Storage Gen2-APIs zum Arbeiten mit Daten in Speicherkonten mit aktiviertem hierarchischen Namespace (HNS). Wenn Sie mit speziellen Funktionen für Data Lake Storage Gen2 arbeiten, z. B. Verzeichnisvorgängen und ACLs, verwenden Sie die Data Lake Storage Gen2-APIs, wie in diesem Artikel gezeigt.

Berücksichtigen Sie bei der Auswahl der APIs, die in einem bestimmten Szenario verwendet werden sollen, die Workload und die Anforderungen Ihrer Anwendung sowie die bekannten Probleme und die Auswirkungen eines HNS auf Workloads und Anwendungen.

Autorisieren des Zugriffs und Herstellen einer Verbindung mit Datenressourcen

Um mit den Codebeispielen in diesem Artikel zu arbeiten, müssen Sie eine autorisierte DataLakeServiceClient-Instanz erstellen, die das Speicherkonto darstellt. Sie können ein DataLakeServiceClient-Objekt mithilfe von Microsoft Entra ID, einem Kontozugriffsschlüssels oder einer gemeinsamen Zugriffssignatur (Shared Access Signature, SAS) autorisieren.

Sie können die Azure-Identitätsclientbibliothek für Python verwenden, um Ihre Anwendung bei Microsoft Entra ID zu authentifizieren.

Erstellen Sie eine Instanz der DataLakeServiceClient-Klasse, und übergeben Sie ein DefaultAzureCredential-Objekt.

def get_service_client_token_credential(self, account_name) -> DataLakeServiceClient:
    account_url = f"https://{account_name}.dfs.core.windows.net"
    token_credential = DefaultAzureCredential()

    service_client = DataLakeServiceClient(account_url, credential=token_credential)

    return service_client

Weitere Informationen zur Verwendung von DefaultAzureCredential zum Autorisieren des Datenzugriffs finden Sie unter Übersicht: Authentifizieren von Python-Apps bei Azure mithilfe des Azure SDK.

Erstellen eines Containers

Ein Container fungiert als Dateisystem für Ihre Dateien. Sie können einen Container mittels der folgenden Methode erstellen:

Das folgende Codebeispiel erstellt einen Container und gibt ein FileSystemClient-Objekt zur späteren Verwendung zurück:

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

    return file_system_client

Erstellen eines Verzeichnisses

Sie können einen Verzeichnisverweis im Container erstellen, indem Sie die folgende Methode verwenden:

Das folgende Codebeispiel fügt ein Verzeichnis zu einem Container hinzu und gibt ein DataLakeDirectoryClient-Objekt zur späteren Verwendung zurück:

def create_directory(self, file_system_client: FileSystemClient, directory_name: str) -> DataLakeDirectoryClient:
    directory_client = file_system_client.create_directory(directory_name)

    return directory_client

Umbenennen oder Verschieben eines Verzeichnisses

Sie können ein Verzeichnis mittels der folgenden Methode umbenennen oder verschieben:

Übergeben Sie den Pfad mit dem neuen Verzeichnisnamen im new_name-Argument. Der Wert muss das folgende Format haben: {Dateisystem}/{Verzeichnis}/{Unterverzeichnis}.

Das folgende Codebeispiel zeigt, wie ein Unterverzeichnis umbenannt wird:

def rename_directory(self, directory_client: DataLakeDirectoryClient, new_dir_name: str):
    directory_client.rename_directory(
        new_name=f"{directory_client.file_system_name}/{new_dir_name}")

Hochladen einer Datei in ein Verzeichnis

Sie können Inhalte mittels der folgenden Methode in eine neue oder vorhandene Datei hochladen:

Das folgende Codebeispiel zeigt, wie sie mithilfe der upload_data-Methode eine Datei in ein Verzeichnis hochladen:

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(data, overwrite=True)

Sie können diese Methode verwenden, um Inhalte zu erstellen und in eine neue Datei hochzuladen, oder Sie können das overwrite-Argument auf True festlegen, um eine vorhandene Datei zu überschreiben.

Anfügen von Daten an eine Datei

Sie können Daten hochladen, die an eine Datei angefügt werden sollen, indem Sie die folgende Methode verwenden:

Das folgende Codebeispiel zeigt, wie Sie mithilfe dieser Schritte Daten an das Ende einer Datei anfügen:

  • Erstellen Sie ein DataLakeFileClient-Objekt, das die Dateiressource repräsentiert, mit der Sie arbeiten.
  • Laden Sie Daten mit der append_data-Methode in die Datei hoch.
  • Schließen Sie den Upload ab, indem Sie die flush_data-Methode aufrufen, um die zuvor hochgeladenen Daten in die Datei zu schreiben.
def append_data_to_file(self, directory_client: DataLakeDirectoryClient, file_name: str):
    file_client = directory_client.get_file_client(file_name)
    file_size = file_client.get_file_properties().size
    
    data = b"Data to append to end of file"
    file_client.append_data(data, offset=file_size, length=len(data))

    file_client.flush_data(file_size + len(data))

Mit dieser Methode können Daten nur an eine Datei angefügt werden, und der Vorgang ist auf 4.000 MiB pro Anforderung beschränkt.

Herunterladen aus einem Verzeichnis

Das folgende Codebeispiel zeigt, wie Sie mithilfe dieser Schritte eine Datei aus einem Verzeichnis in eine lokale Datei herunterladen:

  • Erstellen Sie ein DataLakeFileClient-Objekt, das die Datei darstellt, die Sie herunterladen möchten.
  • Öffnen Sie eine lokale Datei zum Schreiben.
  • Rufen Sie die DataLakeFileClient.download_file-Methode auf, um die Daten aus der Datei zu lesen und sie dann in die lokale Datei zu schreiben.
def download_file_from_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="wb") as local_file:
        download = file_client.download_file()
        local_file.write(download.readall())
        local_file.close()

Auflisten des Verzeichnisinhalts

Sie können Verzeichnisinhalte auflisten, indem Sie die folgende Methode verwenden und das Ergebnis aufzählen:

Beim Aufzählen der Pfade im Ergebnis werden möglicherweise mehrere Anforderungen an den Dienst gestellt, während die Werte abgerufen werden.

Im folgenden Codebeispiel wird der Pfad der einzelnen Unterverzeichnisse und Dateien ausgegeben, die in einem Verzeichnis gespeichert sind:

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')

Löschen eines Verzeichnisses

Sie können ein Verzeichnis mittels der folgenden Methode löschen:

Das folgende Codebeispiel zeigt, wie ein Verzeichnis gelöscht wird:

def delete_directory(self, directory_client: DataLakeDirectoryClient):
    directory_client.delete_directory()

Weitere Informationen