Добавить имя файла к файлу в хранилище Azure

Я немного застрял в простой проблеме, но, похоже, я потерял серое вещество и продолжаю зацикливаться (в этом и есть проблема). Я пытаюсь загрузить файлы из локального хранилища в Azure, а затем добавить имя файла к файлу в облаке, чтобы позже я мог добавить и проверить, обрабатывал ли я уже такой файл.

Вот мой код:

import os
from azure.identity import DefaultAzureCredential
from azure.storage.filedatalake import DataLakeServiceClient,DataLakeFileClient





    # Iterate over files in the local directory
    for filename in os.listdir(local_path):
        if os.path.isfile(os.path.join(local_path, filename)):
            # Get a reference to the file client
            file_client = directory_client.get_file_client(filename)

            # Upload the file to Azure Data Lake Storage
            with open(os.path.join(local_path, filename), "rb") as local_file:
                file_client.upload_data(local_file, overwrite=True)

            if not checkpoint_directory_client.create_file(file=checkpoint_file_name):
                checkpoint_directory_client.create_file(file=checkpoint_file_name)
                checkpoint_file_client = checkpoint_directory_client.get_file_client(checkpoint_file_name)
                
             *<<<I think I need something here but I tried everything and I cannot seem to do it>>>>*

Я также пробовал использовать DataLakeFileClient, но безрезультатно. Я могу либо загрузить в файл одно имя (последнее, которое указывает на позицию внутри цикла), либо получить пустой файл. Мне просто нужен небольшой толчок в правильном направлении!

Я пытаюсь что-то вроде этого

checkpoint_directory_client.create_file(file=checkpoint_file_name)
checkpoint_file_client = checkpoint_directory_client.get_file_client(checkpoint_file_name)
data = filename
checkpoint_file_client.append_data(data,offset=0,length=len(data))
checkpoint_file_client.flush_data(len(data))

Огромное спасибо

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавить имя файла к файлу в хранилище Azure

Вы можете использовать приведенный ниже код, чтобы добавить имя файла к файлу после создания файла контрольной точки, используя метод append_data объекта DataLakeFileClient.

Вот полный код:

Код:

import os
from azure.identity import DefaultAzureCredential
from azure.storage.filedatalake import DataLakeServiceClient, DataLakeFileClient

try:
    account_url = "https://xxxx.dfs.core.windows.net/"
    default_credential = DefaultAzureCredential()
    service_client = DataLakeServiceClient(account_url, credential=default_credential)
    container_name = "test"
    directory_name = "sample"
    filesystem_name = container_name
    directory_name = directory_name
    checkpoint_directory_name = "checkpoint"
    checkpoint_file_name = "checkpointfile.txt"

    local_path = r"C:\Users\xxxx\Documents\venkat1"
    if not os.path.exists(local_path):
        os.mkdir(local_path)
    directory_client = service_client.get_file_system_client(filesystem_name).get_directory_client(directory_name)
    checkpoint_directory_client = service_client.get_directory_client(file_system=filesystem_name, directory=f"{directory_name}/{checkpoint_directory_name}")
    checkpoint_file_client = checkpoint_directory_client.get_file_client(checkpoint_file_name)
    checkpoint_file_service = DataLakeFileClient(account_url=account_url, credential=default_credential, file_system_name=filesystem_name, file_path=checkpoint_file_client.path_name)

    # Iterate over files in the local directory
    for filename in os.listdir(local_path):
        if os.path.isfile(os.path.join(local_path, filename)):
            file_client = directory_client.get_file_client(filename)
            with open(os.path.join(local_path, filename), "rb") as local_file:
                file_client.upload_data(local_file, overwrite=True)

            checkpoint_directory_client.create_file(file=checkpoint_file_name)
            checkpoint_file_client = checkpoint_directory_client.get_file_client(checkpoint_file_name)
            data = filename.encode('utf-8')
            checkpoint_file_client.append_data(data, offset=0, length=len(data))
            checkpoint_file_client.flush_data(len(data))

    print("All files uploaded successfully.")

except Exception as ex:
    print('Exception:')
    print(ex)

Приведенный выше код загружает файлы из локального каталога в Azure Data Lake Storage и создает checkpoint file для отслеживания отправленных файлов. Для каждого файла он добавляет имя файла к файлу контрольной точки, используя метод append_data объекта DataLakeFileClient.

Выход:

All files uploaded successfully.

Портал:

Ссылка:

Используйте Python для управления данными в Azure Data Lake Storage Gen2 — Azure Storage | Microsoft Learn

Обновлять:

Чтобы записать все файлы в файл (контрольной точки), вы можете изменить код, как показано ниже:

Code:

for filename in os.listdir(local_path):
        if os.path.isfile(os.path.join(local_path, filename)):
            file_name, file_extension = os.path.splitext(filename)
            new_filename = f"{file_name}.{file_extension[1:]}" 
            file_client = directory_client.get_file_client(filename)
            with open(os.path.join(local_path, filename), "rb") as local_file:
                file_client.upload_data(local_file, overwrite=True)

            data = f"{new_filename}\n".encode('utf-8')
            offset = checkpoint_file_client_new.get_file_properties().size
            checkpoint_file_client_new.append_data(data, offset=offset, length=len(data))
            checkpoint_file_client_new.flush_data(offset + len(data))

Выход:

Я попробовал это, и в итоге в файл в облаке записано только одно имя. Я хочу, чтобы все они были записаны в файл, поскольку у меня несколько файлов.

Yami Mahō 03.04.2024 09:12

Обновленный ответ. Надеюсь, он решит вашу проблему.

Venkatesan 03.04.2024 10:21

Оно работает! Спасибо! Не могли бы вы немного объяснить эту часть, чтобы я лучше понял?

Yami Mahō 03.04.2024 13:36

Код проверяет, является ли каждый элемент в локальном каталоге файлом, а затем извлекает его имя и расширение. Он загружает каждый файл в хранилище Azure, при необходимости перезаписывая существующие. Наконец, он добавляет загруженные имена файлов в файл контрольной точки, обеспечивая целостность данных. .

Venkatesan 03.04.2024 13:51

Другие вопросы по теме