Dikembangkan untuk Azure Files dengan Python

Pelajari dasar penggunaan Python untuk mengembangkan aplikasi atau layanan yang menggunakan Azure Files untuk menyimpan berkas data. Buat aplikasi konsol dan pelajari cara melakukan tindakan dasar dengan Python dan Azure Files:

  • Buat berbagi berkas Azure
  • Buat direktori
  • Hitung file dan direktori dalam berbagi file Azure
  • Mengunggah, mengunduh, dan menghapus file
  • Membuat pencadangan berbagi berkas dengan menggunakan snapshot

Catatan

Karena Azure Files dapat diakses lewat SMB, Anda dapat menulis aplikasi sederhana yang mengakses berbagi berkas Azure menggunakan kelas dan fungsi Python I/O standar. Artikel ini menjelaskan cara untuk menulis aplikasi yang menggunakan Azure Storage Python SDK, yang menggunakan REST API File untuk berkomunikasi dengan Azure Files.

Berlaku untuk

Jenis berbagi File SMB NFS
Berbagi file standar (GPv2), LRS/ZRS Yes No
Berbagi file standar (GPv2), GRS/GZRS Yes No
Berbagi file premium (FileStorage), LRS/ZRS Yes No

Mengunduh dan Memasang Azure Storage SDK untuk Python

Catatan

Jika Anda meningkatkan dari Azure Storage SDK untuk Python versi 0.36 atau yang lebih lama, hapus pemasangan SDK lama pip uninstall azure-storage yang digunakan sebelum memasang paket terbaru.

Pustaka klien Azure Files untuk Python memerlukan Python 3.8+.

Instal melalui PyPI

Untuk menginstal melalui Python Package Index (PyPI), ketik:

pip install azure-storage-file-share

Atur aplikasi Anda untuk menggunakan Azure Files

Tambahkan kode berikut di dekat bagian atas file sumber Python untuk menggunakan cuplikan kode dalam artikel ini.

from azure.core.exceptions import (
    ResourceExistsError,
    ResourceNotFoundError
)

from azure.storage.fileshare import (
    ShareServiceClient,
    ShareClient,
    ShareDirectoryClient,
    ShareFileClient
)

Mengatur koneksi ke Azure Files

ShareServiceClient memampukan Anda bekerja dengan berbagi, direktori, dan berkas. Kode ini membuat ShareServiceClient objek menggunakan akun penyimpanan string koneksi:

# Create a ShareServiceClient from a connection string
service_client = ShareServiceClient.from_connection_string(connection_string)

Membuat Azure file share

Contoh kode berikut menggunakan objek ShareClient untuk membuat berbagi jika tidak ada.

def create_file_share(self, connection_string, share_name):
    try:
        # Create a ShareClient from a connection string
        share_client = ShareClient.from_connection_string(
            connection_string, share_name)

        print("Creating share:", share_name)
        share_client.create_share()

    except ResourceExistsError as ex:
        print("ResourceExistsError:", ex.message)

Membuat direktori

Anda dapat mengatur penyimpanan dengan menyimpan berkas di dalam subdirektori alih-alih meletakkan semuanya dalam direktori akar.

Metode berikut membuat direktori di akar berbagi berkas yang ditentukan dengan menggunakan objek ShareDirectoryClient.

def create_directory(self, connection_string, share_name, dir_name):
    try:
        # Create a ShareDirectoryClient from a connection string
        dir_client = ShareDirectoryClient.from_connection_string(
            connection_string, share_name, dir_name)

        print("Creating directory:", share_name + "/" + dir_name)
        dir_client.create_directory()

    except ResourceExistsError as ex:
        print("ResourceExistsError:", ex.message)

Mengunggah file

Di bagian ini, Anda mempelajari cara mengunggah file dari penyimpanan lokal ke Azure Files.

Metode berikut mengunggah konten berkas yang ditentukan ke direktori yang ditentukan dalam berbagi berkas Azure yang ditentukan.

def upload_local_file(self, connection_string, local_file_path, share_name, dest_file_path):
    try:
        source_file = open(local_file_path, "rb")
        data = source_file.read()

        # Create a ShareFileClient from a connection string
        file_client = ShareFileClient.from_connection_string(
            connection_string, share_name, dest_file_path)

        print("Uploading to:", share_name + "/" + dest_file_path)
        file_client.upload_file(data)

    except ResourceExistsError as ex:
        print("ResourceExistsError:", ex.message)

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Hitung file dan direktori dalam berbagi file Azure

Untuk mencantumkan berkas dan direktori dalam subdirektori, gunakan metode list_directories_and_files. Metode ini mengembalikan auto-paging iterable. Kode berikut menghasilkan nama setiap berkas dan subdirektori dalam direktori yang ditentukan ke konsol.

def list_files_and_dirs(self, connection_string, share_name, dir_name):
    try:
        # Create a ShareClient from a connection string
        share_client = ShareClient.from_connection_string(
            connection_string, share_name)

        for item in list(share_client.list_directories_and_files(dir_name)):
            if item["is_directory"]:
                print("Directory:", item["name"])
            else:
                print("File:", dir_name + "/" + item["name"])

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Unduh file

Untuk mengunduh data dari berkas, gunakan download_file.

Contoh berikut menunjukkan penggunaan untuk download_file mendapatkan konten berkas yang ditentukan dan menyimpannya secara lokal dengan DOWNLOADED- yang telah ditentukan sebelumnya ke nama berkas.

def download_azure_file(self, connection_string, share_name, dir_name, file_name):
    try:
        # Build the remote path
        source_file_path = dir_name + "/" + file_name

        # Add a prefix to the filename to 
        # distinguish it from the uploaded file
        dest_file_name = "DOWNLOADED-" + file_name

        # Create a ShareFileClient from a connection string
        file_client = ShareFileClient.from_connection_string(
            connection_string, share_name, source_file_path)

        print("Downloading to:", dest_file_name)

        # Open a file for writing bytes on the local system
        with open(dest_file_name, "wb") as data:
            # Download the file from Azure into a stream
            stream = file_client.download_file()
            # Write the stream to the local file
            data.write(stream.readall())

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Buat rekam jepret berbagi

Anda dapat membuat salinan waktu poin dari seluruh berbagi berkas Anda.

def create_snapshot(self, connection_string, share_name):
    try:
        # Create a ShareClient from a connection string
        share_client = ShareClient.from_connection_string(
            connection_string, share_name)

        # Create a snapshot
        snapshot = share_client.create_snapshot()
        print("Created snapshot:", snapshot["snapshot"])

        # Return the snapshot time so 
        # it can be accessed later
        return snapshot["snapshot"]

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Daftar berbagi dan snapshot

Anda dapat mencantumkan semua snapshot untuk bagian tertentu.

def list_shares_snapshots(self, connection_string):
    try:
        # Create a ShareServiceClient from a connection string
        service_client = ShareServiceClient.from_connection_string(connection_string)

        # List the shares in the file service
        shares = list(service_client.list_shares(include_snapshots=True))

        for share in shares:
            if (share["snapshot"]):
                print("Share:", share["name"], "Snapshot:", share["snapshot"])
            else:
                print("Share:", share["name"])

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Telusuri berbagi rekam snapshot

Anda dapat menelusuri setiap snapshot berbagi untuk mengambil berkas dan direktori dari waktu tersebut.

def browse_snapshot_dir(self, connection_string, share_name, snapshot_time, dir_name):
    try:
        # Create a ShareClient from a connection string
        snapshot = ShareClient.from_connection_string(
            conn_str=connection_string, share_name=share_name, snapshot=snapshot_time)

        print("Snapshot:", snapshot_time)

        for item in list(snapshot.list_directories_and_files(dir_name)):
            if item["is_directory"]:
                print("Directory:", item["name"])
            else:
                print("File:", dir_name + "/" + item["name"])

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Dapatkan berkas dari snapshot berbagi

Anda dapat mengunduh file dari rekam jepret berbagi, yang memungkinkan Anda memulihkan versi file sebelumnya.

def download_snapshot_file(self, connection_string, share_name, snapshot_time, dir_name, file_name):
    try:
        # Build the remote path
        source_file_path = dir_name + "/" + file_name

        # Add a prefix to the local filename to 
        # indicate it's a file from a snapshot
        dest_file_name = "SNAPSHOT-" + file_name

        # Create a ShareFileClient from a connection string
        snapshot_file_client = ShareFileClient.from_connection_string(
            conn_str=connection_string, share_name=share_name, 
            file_path=source_file_path, snapshot=snapshot_time)

        print("Downloading to:", dest_file_name)

        # Open a file for writing bytes on the local system
        with open(dest_file_name, "wb") as data:
            # Download the file from Azure into a stream
            stream = snapshot_file_client.download_file()
            # Write the stream to the local file
            data.write(stream.readall())

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Menghapus satu berbagi snapshot

Anda dapat menghapus satu berbagi snapshot.

def delete_snapshot(self, connection_string, share_name, snapshot_time):
    try:
        # Create a ShareClient for a snapshot
        snapshot_client = ShareClient.from_connection_string(conn_str=connection_string, share_name=share_name, snapshot=snapshot_time)

        print("Deleting snapshot:", snapshot_time)

        # Delete the snapshot
        snapshot_client.delete_share()

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Hapus file

Untuk menghapus berkas, hubungi delete_file.

def delete_azure_file(self, connection_string, share_name, file_path):
    try:
        # Create a ShareFileClient from a connection string
        file_client = ShareFileClient.from_connection_string(
            connection_string, share_name, file_path)

        print("Deleting file:", share_name + "/" + file_path)

        # Delete the file
        file_client.delete_file()

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Hapus bagikan saat berbagi snapshot ada

Untuk menghapus berbagi yang berisi snapshot, hubungi delete_share dengan delete_snapshots=True.

def delete_share(self, connection_string, share_name):
    try:
        # Create a ShareClient from a connection string
        share_client = ShareClient.from_connection_string(
            connection_string, share_name)

        print("Deleting share:", share_name)

        # Delete the share and snapshots
        share_client.delete_share(delete_snapshots=True)

    except ResourceNotFoundError as ex:
        print("ResourceNotFoundError:", ex.message)

Langkah berikutnya

Sekarang setelah Anda mempelajari cara memanipulasi Azure Files dengan Python, ikuti tautan ini untuk mempelajari lebih lanjut.

Untuk sampel kode terkait menggunakan Python versi 2 SDK yang tidak digunakan lagi, lihat Sampel kode menggunakan Python versi 2.