circuit

How to Upload Files to SharePoint Using Python

Upload files to MS SharePoint using Office365 Python SDK


image

Introduction

This article explains how to upload your files to Microsoft SharePoint using Python.

What is a SharePoint?

SharePoint in Microsoft 365 A cloud-based service, hosted by Microsoft, for businesses of all sizes. Instead of installing and deploying the SharePoint Server on-premises, any business can subscribe to a Microsoft 365 plan or to the standalone SharePoint Online service. Your employees can create sites to share documents and information with colleagues, partners, and customers.*

We will be using the python office365 SDK client to interact with the share point.

Work Flow:

  • Install Office365 Python client

  • Initiate the authentication flow

  • Create the upload directory in SharePoint

  • Upload file(s)

Install Office365 python client:

$pip install Office365-REST-Python-Client

Office365-REST-Python-Client

GitHub - vgrem/Office365-REST-Python-Client: Office 365 & Microsoft Graph Library for Python

Create a SharePoint client context object:

To work with SharePoint APIs, we need to create a ClientContext object. This can be done with either:

  • username and password or

  • the client id and client secret.

For most of the real-time use cases, we may not be using username and password. Therefore, in this article, we will create the context object using the client id and secret.

Bonus: The client id and secret can preferably be stored in a vault or any convenient way as you do in your project. If you'd like to have a look at storing secrets in vault, please read this article.

i) Using app credentials:

from office365.runtime.auth.client_credential import ClientCredential
from office365.sharepoint.client_context import ClientContext


def get_sharepoint_context_using_app():

    # Get sharepoint credentials
    sharepoint_url = 'https://{your-tenant-prefix}.sharepoint.com'

    # Initialize the client credentials
    client_credentials = ClientCredential(<your client id>, <your secret>)

    # create client context object
    ctx = ClientContext(sharepoint_url).with_credentials(client_credentials)

    return ctx

ii) Using user credentials:

from office365.runtime.auth.user_credential import UserCredential
from office365.sharepoint.client_context import ClientContext


def get_sharepoint_context_using_user():

    # Get sharepoint credentials
    sharepoint_url = 'https://{your-tenant-prefix}.sharepoint.com'

    # Initialize the client credentials
    user_credentials = UserCredential(<your username>, <your password>)

    # create client context object
    ctx = ClientContext(sharepoint_url).with_credentials(user_credentials)

    return ctx

Now that we have received the context object, let’s start interacting with the SharePoint APIs.

Create a share point directory using python:

To upload files to SharePoint, let us first create a SharePoint directory. The below code creates a directory in the share point server inside the Documents folder.

Note: Please note that the documents folder is named Shared Documents in the relative_url.

def create_sharepoint_directory(dir_name: str):
    """
    Creates a folder in the sharepoint directory.
    """
    if dir_name:

        ctx = get_sharepoint_context_using_app()

        result = ctx.web.folders.add(f'Shared Documents/{dir_name}').execute_query()

        if result:
            # documents is titled as Shared Documents for relative URL in SP
            relative_url = f'Shared Documents/{dir_name}'
            return relative_url

create_sharepoint_directory('test directory')

Output:

Shared Documents/test directory

Upload multiple files to Share point:

The below method uses ThreadPoolExecutor to upload multiple files to SharePoint. The upload_file_lst is a list of files. We get the folder URL from the context object using the relative_url of the directory we created in our previous step.

Finally from the future result object, we call execute_query() to complete the upload.

from concurrent.futures import ThreadPoolExecutor, as_completed

def upload_to_sharepoint(dir_name: str, upload_file_lst: list):
    sp_relative_url = create_sharepoint_directory(dir_name)
    ctx = get_sharepoint_context()

    target_folder = ctx.web.get_folder_by_server_relative_url(sp_relative_url)

    with ThreadPoolExecutor(max_workers=5) as executor:
        for file_name in upload_file_lst:
            with open(file_name, 'rb') as content_file:
                file_content = content_file.read()
                futures = executor.submit(target_folder.upload_file, file_name, file_content)
                if as_completed(futures):
                    futures.result().execute_query()

Upload a single file to SharePoint:

def upload_to_sharepoint(dir_name: str, file_name: str):

    sp_relative_url = create_sharepoint_directory(dir_name)
    ctx = get_sharepoint_context()

    target_folder = ctx.web.get_folder_by_server_relative_url(sp_relative_url)

    with open(file_name, 'rb') as content_file:
        file_content = content_file.read()
        target_folder.upload_file(file_name, file_content).execute_query()

Upload multiple files to SharePoint with the progress bar:

Now that we have seen the upload of single/multiple files to share point, we will extend the multiple file upload code a little and add a progress bar to show the upload.

from concurrent.futures import ThreadPoolExecutor, as_completed


def upload_to_sharepoint(dir_name: str, upload_file_lst: list):

    sp_relative_url = create_sharepoint_directory(dir_name)

    ctx = get_sharepoint_context()

    target_folder = ctx.web.get_folder_by_server_relative_url(sp_relative_url)

    no_of_upload_files = len(upload_file_lst)

    with tqdm(total=no_of_upload_files, desc="Uploading..", initial=0, unit_scale=True, colour='green') as pbar:
        with ThreadPoolExecutor(max_workers=5) as executor:
            for file_name in upload_file_lst:
                with open(file_name, 'rb') as content_file:
                    file_content = content_file.read()
                    futures = executor.submit(target_folder.upload_file, file_name, file_content)
                    if as_completed(futures):
                        futures.result().execute_query()
                        pbar.update(1)

To learn more about showing progress bars during upload/download, please refer to this article.

Summary

  • We have used Office365 Python SDK to interact with share point. We could very well do the same with other Microsoft products like MS Outlook, OneDrive, Teams, etc.
  • We have 2 types of auth flows to create a context object, app credentials, and user credentials.
  • Create a context object and use the same to perform any operation in SharePoint.

Originally published at https://dock2learn.com on April 25, 2022.




Continue Learning