Я использую следующий код для получения файлов в подкаталоге контейнера:
from azure.storage.filedatalake import DataLakeServiceClient
remote_paths = service_client.get_file_system_client("mycontainer").get_paths(path = "a/b/c")
Проблема в том, что get_paths()
возвращает все файлы и папки во всех подкаталогах c
, но меня интересуют только файлы в каталоге c
.
Я знаю о .is_directory
, но это все равно возвращает файлы в подкаталогах.
Я мог бы удалить путь (a/b/c
) из набора результатов, а затем проверить наличие /
, что указывало бы на то, что файл находится во вложенной папке, но мне интересно, есть ли лучший способ?
Вы правы, метод get_paths() в Azure DataLakeServiceClient действительно возвращает все файлы и папки по указанному пути и его подкаталогам. К сожалению, не существует встроенного способа ограничить это только каталогом верхнего уровня.
Однако вы все равно можете отфильтровать результаты, чтобы включать только файлы в каталоге верхнего уровня, проверив, содержит ли имя пути какие-либо дополнительные косые черты за пределами исходного каталога. Вот пример того, как вы можете это сделать:
from azure.storage.filedatalake import DataLakeServiceClient
def get_top_level_files(service_client, container_name, directory_path):
file_system_client = service_client.get_file_system_client(container_name)
paths = file_system_client.get_paths(path=directory_path)
top_level_files = []
for path in paths:
# Check if the path is a file and is in the top-level directory
if not path.is_directory and '/' not in path.name[len(directory_path):]:
top_level_files.append(path)
return top_level_files
Использование: service_client = DataLakeServiceClient(...) top_level_files = get_top_level_files(service_client, "mycontainer", "a/b/c")
В этом коде path.name[len(directory_path):] получает часть пути после указанного каталога, а '/' не в path.name[len(directory_path):] проверяет, есть ли эта часть.
К сожалению, я не думаю, что есть более простой способ добиться этого, но этот метод надежен и надежен.
Добро пожаловать, Кизель, пожалуйста. Не забудьте проголосовать за мой ответ.
@downvoters, почему?
использовать len(directory_path) для нарезки строк очень разумно. Спасибо!