Я немного застрял в простой проблеме, но, похоже, я потерял серое вещество и продолжаю зацикливаться (в этом и есть проблема). Я пытаюсь загрузить файлы из локального хранилища в 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))
Огромное спасибо






Добавить имя файла к файлу в хранилище 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.

Портал:

Ссылка:
Обновлять:
Чтобы записать все файлы в файл (контрольной точки), вы можете изменить код, как показано ниже:
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))
Выход:
Обновленный ответ. Надеюсь, он решит вашу проблему.
Оно работает! Спасибо! Не могли бы вы немного объяснить эту часть, чтобы я лучше понял?
Код проверяет, является ли каждый элемент в локальном каталоге файлом, а затем извлекает его имя и расширение. Он загружает каждый файл в хранилище Azure, при необходимости перезаписывая существующие. Наконец, он добавляет загруженные имена файлов в файл контрольной точки, обеспечивая целостность данных. .
Я попробовал это, и в итоге в файл в облаке записано только одно имя. Я хочу, чтобы все они были записаны в файл, поскольку у меня несколько файлов.