Zarządzanie katalogami i plikami w usłudze Azure Data Lake Storage 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.
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
Subskrypcja platformy Azure. Zobacz Uzyskiwanie bezpłatnej wersji próbnej platformy Azure.
Konto magazynu z włączoną hierarchiczną przestrzenią nazw . Postępuj zgodnie z tymi instrukcjami, aby je utworzyć.
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 overwrite
True
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:
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()