Använda Python för att hantera kataloger och filer i Azure Data Lake Storage Gen2

Den här artikeln visar hur du använder Python för att skapa och hantera kataloger och filer i lagringskonton som har ett hierarkiskt namnområde.

Mer information om hur du hämtar, anger och uppdaterar åtkomstkontrollistor (ACL) för kataloger och filer finns i Använda Python för att hantera ACL:er i Azure Data Lake Storage Gen2.

Paket (PyPi)Exempel-API-referens | | | Gen1 till Gen2-mappning | Ge feedback

Förutsättningar

Konfigurera projektet

Det här avsnittet beskriver hur du förbereder ett projekt för att arbeta med Azure Data Lake Storage-klientbiblioteket för Python.

Från projektkatalogen installerar du paket för Azure Data Lake Storage- och Azure Identity-klientbiblioteken med hjälp av pip install kommandot . Azure-identitetspaketet behövs för lösenordslösa anslutningar till Azure-tjänster.

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

Öppna sedan kodfilen och lägg till nödvändiga importinstruktioner. I det här exemplet lägger vi till följande i vår .py-fil :

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

Kommentar

Med åtkomst med flera protokoll i Data Lake Storage kan program använda både Blob-API:er och Data Lake Storage Gen2-API:er för att arbeta med data i lagringskonton med hierarkisk namnrymd (HNS) aktiverad. När du arbetar med funktioner som är unika för Data Lake Storage Gen2, till exempel katalogåtgärder och ACL:er, använder du API:erna för Data Lake Storage Gen2, som du ser i den här artikeln.

När du väljer vilka API:er som ska användas i ett visst scenario bör du överväga arbetsbelastningen och programmets behov, tillsammans med de kända problemen och effekten av HNS på arbetsbelastningar och program.

Auktorisera åtkomst och ansluta till dataresurser

Om du vill arbeta med kodexemplen i den här artikeln måste du skapa en auktoriserad DataLakeServiceClient-instans som representerar lagringskontot. Du kan auktorisera ett DataLakeServiceClient objekt med hjälp av Microsoft Entra-ID, en kontoåtkomstnyckel eller en signatur för delad åtkomst (SAS).

Du kan använda Azure Identity-klientbiblioteket för Python för att autentisera ditt program med Microsoft Entra-ID.

Skapa en instans av klassen DataLakeServiceClient och skicka ett 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

Mer information om hur du använder DefaultAzureCredential för att auktorisera åtkomst till data finns i Översikt: Autentisera Python-appar till Azure med hjälp av Azure SDK.

Skapa en container

En container fungerar som ett filsystem för dina filer. Du kan skapa en container med hjälp av följande metod:

I följande kodexempel skapas en container och ett FileSystemClient objekt returneras för senare användning:

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

Skapa en katalog

Du kan skapa en katalogreferens i containern med hjälp av följande metod:

I följande kodexempel läggs en katalog till i en container och ett DataLakeDirectoryClient objekt returneras för senare användning:

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

    return directory_client

Byta namn på eller flytta en katalog

Du kan byta namn på eller flytta en katalog med hjälp av följande metod:

Skicka sökvägen med det nya katalognamnet i new_name argumentet. Värdet måste ha följande format: {filesystem}/{directory}/{subdirectory}.

I följande kodexempel visas hur du byter namn på en underkatalog:

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}")

Ladda upp en fil till en katalog

Du kan ladda upp innehåll till en ny eller befintlig fil med hjälp av följande metod:

Följande kodexempel visar hur du laddar upp en fil till en katalog med hjälp av metoden 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(data, overwrite=True)

Du kan använda den här metoden för att skapa och ladda upp innehåll till en ny fil, eller så kan du ange overwrite argumentet till True att skriva över en befintlig fil.

Lägga till data i en fil

Du kan ladda upp data som ska läggas till i en fil med hjälp av följande metod:

  • DataLakeFileClient.append_data metod.

Följande kodexempel visar hur du lägger till data i slutet av en fil med hjälp av följande steg:

  • Skapa ett DataLakeFileClient objekt som representerar den filresurs som du arbetar med.
  • Ladda upp data till filen med hjälp av metoden append_data .
  • Slutför uppladdningen genom att anropa metoden flush_data för att skriva tidigare uppladdade data till filen.
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))

Med den här metoden kan data endast läggas till i en fil och åtgärden är begränsad till 4 000 MiB per begäran.

Ladda ned från en katalog

Följande kodexempel visar hur du laddar ned en fil från en katalog till en lokal fil med hjälp av följande steg:

  • Skapa ett DataLakeFileClient objekt som representerar den fil som du vill ladda ned.
  • Öppna en lokal fil för skrivning.
  • Anropa metoden DataLakeFileClient.download_file för att läsa från filen och skriv sedan data till den lokala filen.
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()

Lista kataloginnehåll

Du kan visa kataloginnehåll med hjälp av följande metod och räkna upp resultatet:

Om du räknar upp sökvägarna i resultatet kan du göra flera begäranden till tjänsten när du hämtar värdena.

I följande kodexempel skrivs sökvägen till varje underkatalog och fil som finns i en katalog ut:

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

Ta bort en katalog

Du kan ta bort en katalog med hjälp av följande metod:

Följande kodexempel visar hur du tar bort en katalog:

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

Se även