Создание сценария Python для создания дерева структуры каталогов библиотеки документов SharePoint - PullRequest
0 голосов
/ 03 апреля 2019

Цель: Создать скрипт Python, который будет загружать все файлы из библиотеки документов SharePoint и хранить в одной структуре папок (включая подпапки до N-й)

Использование: Python 3.6 и замечательного инструмента SharePoint REST API от @Vadim Gremyachev

Сделано до сих пор:

a) Получение списка папок в корне

б) Получение списка файлов и папок в заданной папке

c) Итеративная загрузка файлов из заданной папки

Я не специалист по рекурсивной логике, и мне нужна помощь для решения этой проблемы.

Пример кода:

from office365.runtime.auth.authentication_context import AuthenticationContext
from office365.sharepoint.client_context import ClientContext
from office365.sharepoint.file import File
from time import time


def print_folder_contents(ctx, folder_name):

    try:
        folder = ctx.web.get_folder_by_server_relative_url("/sites/abc/Shared Documents/"+folder_name+"/")
        ctx.load(folder)
        ctx.execute_query()

        # Folders
        fold_names = []
        sub_folders = folder.folders
        ctx.load(sub_folders)
        ctx.execute_query()
        for s_folder in sub_folders:
            # print("Folder name: {0}".format(folder.properties["Name"]))
            fold_names.append(s_folder.properties["Name"])


        # Files
        f_names = []
        files = folder.files
        ctx.load(files)
        ctx.execute_query()
        for myfile in files:
            # print("File name: {0}".format(myfile.properties["Name"]))
            f_names.append(myfile.properties["Name"])
        return fold_names, f_names

    except Exception as e:
        print('Problem printing out library contents: ', e)


def print_root_contents(ctx):

    try:
        list_object = ctx.web.lists.get_by_title('Documents')
        folder = list_object.root_folder
        ctx.load(folder)
        ctx.execute_query()

        folders = folder.folders
        ctx.load(folders)
        ctx.execute_query()

        for myfolder in folders:
            print("For Folder : {0}".format(myfolder.properties["Name"]))
            folder_list, files_list = print_folder_contents(ctx)  # , myfolder.properties["Name"])
            print("Sub folders - ", folder_list)
            print("Files - ", files_list)

    except Exception as e:
        print('Problem printing out library contents: ', e)

ctx = None
folder_name = 'alpha_test'
url = 'https://company.sharepoint.com/sites/abc'
ctx_auth = AuthenticationContext(url=url)
if ctx_auth.acquire_token_for_user(username='id', password='pass'):
    ctx = ClientContext(url, ctx_auth)
print_root_contents(ctx)

Приведенный выше код отлично работает с файлами при перечислении всех папок корневого уровня, внутренних подпапок и списка файлов одного уровня. Мне нужен JSON (python dict), представляющий структуру каталогов.

Пример python dict (fi: файлы, fo: папки):

Например: 1

{
  "root": [
    {
      "fo1": [
        "fi1",
        "fi2"
      ],
      "fo2": [
        "fi1",
        "fi2"
      ]
    },
    "fi1",
    "fi2"
  ]
}

Например: 2

{
  "root": [
    {
      "fo1": {
        "fo1": "f1",
        "fo2": [
          "f1",
          "f2"
        ]
      },
      "fo2": [
        "fi1",
        "fi2"
      ]
    },
    "fi1",
    "fi2"
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...