Zarządzanie katalogami i plikami w usłudze Azure Data Lake Storage Gen2 przy użyciu języka Python

W tym artykule pokazano, jak używać języka Python do tworzenia katalogów i plików oraz plików na kontach magazynu, które mają hierarchiczną przestrzeń nazw.

Aby dowiedzieć się, jak pobierać, ustawiać i aktualizować listy kontroli dostępu (ACL) katalogów i plików, zobacz Używanie języka Python do zarządzania listami ACL w usłudze Azure Data Lake Storage Gen2.

Package (PyPi)Samples | API reference Gen1 to Gen2 mapping Give Feedback (Dokumentacja interfejsu API pakietów (PyPi) | Dokumentacja | interfejsu API gen1 do mapowania | gen2

Wymagania wstępne

konfigurowanie projektu

Ta sekcja przeprowadzi Cię przez proces przygotowywania projektu do pracy z biblioteką klienta usługi Azure Data Lake Storage dla języka Python.

Z katalogu projektu zainstaluj pakiety dla bibliotek klienckich usługi Azure Data Lake Storage i Azure Identity przy użyciu pip install polecenia . Pakiet azure-identity jest wymagany w przypadku połączeń bez hasła z usługami platformy Azure.

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

Następnie otwórz plik kodu i dodaj niezbędne instrukcje importu. W tym przykładzie dodamy następujący kod do naszego pliku .py :

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

Uwaga

Dostęp do wielu protokołów w usłudze Data Lake Storage umożliwia aplikacjom korzystanie zarówno z interfejsów API obiektów blob, jak i interfejsów API usługi Data Lake Storage Gen2 do pracy z danymi na kontach magazynu z włączoną hierarchiczną przestrzenią nazw (HNS). Podczas pracy z funkcjami unikatowymi dla usługi Data Lake Storage Gen2, takimi jak operacje katalogów i listy ACL, użyj interfejsów API usługi Data Lake Storage Gen2, jak pokazano w tym artykule.

Podczas wybierania interfejsów API, które mają być używane w danym scenariuszu, należy wziąć pod uwagę obciążenie i potrzeby aplikacji wraz ze znanymi problemami i wpływem sieci HNS na obciążenia i aplikacje.

Autoryzowanie dostępu i nawiązywanie połączenia z zasobami danych

Aby pracować z przykładami kodu w tym artykule, należy utworzyć autoryzowane wystąpienie Elementu DataLakeServiceClient reprezentujące konto magazynu. Obiekt można autoryzować DataLakeServiceClient przy użyciu identyfikatora Entra firmy Microsoft, klucza dostępu do konta lub sygnatury dostępu współdzielonego (SAS).

Możesz użyć biblioteki klienta tożsamości platformy Azure dla języka Python do uwierzytelniania aplikacji za pomocą identyfikatora Entra firmy Microsoft.

Utwórz wystąpienie klasy DataLakeServiceClient i przekaż obiekt DefaultAzureCredential .

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

Aby dowiedzieć się więcej na temat autoryzowania DefaultAzureCredential dostępu do danych, zobacz Omówienie: Uwierzytelnianie aplikacji języka Python na platformie Azure przy użyciu zestawu Azure SDK.

Tworzenie kontenera

Kontener działa jako system plików. Kontener można utworzyć przy użyciu następującej metody:

Poniższy przykład kodu tworzy kontener i zwraca obiekt do późniejszego FileSystemClient użycia:

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

Tworzenie katalogu

Odwołanie do katalogu można utworzyć w kontenerze przy użyciu następującej metody:

Poniższy przykład kodu dodaje katalog do kontenera i zwraca obiekt do późniejszego DataLakeDirectoryClient użycia:

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

    return directory_client

Zmienianie nazwy lub przenoszenie katalogu

Możesz zmienić nazwę lub przenieść katalog przy użyciu następującej metody:

Przekaż ścieżkę z nową nazwą katalogu w argumencie new_name . Wartość musi mieć następujący format: {filesystem}/{directory}/{subdirectory}.

W poniższym przykładzie kodu pokazano, jak zmienić nazwę podkatalogu:

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

Przekazywanie pliku do katalogu

Zawartość można przekazać do nowego lub istniejącego pliku przy użyciu następującej metody:

Poniższy przykład kodu pokazuje, jak przekazać plik do katalogu przy użyciu metody 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)

Za pomocą tej metody można utworzyć i przekazać zawartość do nowego pliku lub ustawić argument na overwriteTrue wartość , aby zastąpić istniejący plik.

Dołączanie danych do pliku

Dane do dołączenia do pliku można przekazać przy użyciu następującej metody:

  • DataLakeFileClient.append_data metodę.

Poniższy przykład kodu pokazuje, jak dołączyć dane na końcu pliku, wykonując następujące kroki:

  • DataLakeFileClient Utwórz obiekt reprezentujący zasób pliku, z którym pracujesz.
  • Przekaż dane do pliku przy użyciu metody append_data .
  • Ukończ przekazywanie, wywołując metodę flush_data , aby zapisać wcześniej przekazane dane do pliku.
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))

W przypadku tej metody dane można dołączać tylko do pliku, a operacja jest ograniczona do 4000 MiB na żądanie.

Pobieranie z katalogu

Poniższy przykład kodu pokazuje, jak pobrać plik z katalogu do pliku lokalnego, wykonując następujące kroki:

  • DataLakeFileClient Utwórz obiekt reprezentujący plik, który chcesz pobrać.
  • Otwórz plik lokalny do zapisu.
  • Wywołaj metodę DataLakeFileClient.download_file , aby odczytać z pliku, a następnie zapisz dane w pliku lokalnym.
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()

Wyświetlanie zawartości katalogu

Zawartość katalogu można wyświetlić przy użyciu następującej metody i wyliczyć wynik:

Wyliczanie ścieżek w wyniku może wysyłać wiele żądań do usługi podczas pobierania wartości.

Poniższy przykład kodu wyświetla ścieżkę każdego podkatalogu i pliku znajdującego się w katalogu:

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

Usuwanie katalogu

Katalog można usunąć przy użyciu następującej metody:

W poniższym przykładzie kodu pokazano, jak usunąć katalog:

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

Zobacz też