Verwalten von Verzeichnissen und Dateien in Azure Data Lake Storage mit Python

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.

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

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üssel oder einer freigegebenen 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:

Im folgenden Codebeispiel wird ein Container erstellt und ein FileSystemClient-Objekt für die spätere Verwendung zurückgegeben:

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:

Im folgenden Codebeispiel wird einem Container ein Verzeichnis hinzugefügt und ein DataLakeDirectoryClient-Objekt für die spätere Verwendung zurückgegeben:

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

Verwenden Sie die folgende Methode, um Daten an eine Datei anzufügen:

Das folgende Codebeispiel zeigt, wie Daten mithilfe der folgenden Schritte an das Ende einer Datei angefügt werden:

  • Erstellen Sie ein DataLakeFileClient - Objekt, um die Dateiressource darzustellen, mit der Sie arbeiten.
  • Laden Sie Daten mithilfe 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

Im folgenden Codebeispiel wird gezeigt, wie Sie eine Datei aus einem Verzeichnis mithilfe der folgenden Schritte in eine lokale Datei herunterladen:

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

Verzeichnisinhalt auflisten

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

Beim Aufzählen der Pfade im Ergebnis können beim Abrufen der Werte mehrere Anforderungen an den Dienst vorgenommen 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()

Siehe auch