How to upload a file to sharepoint site using python script
Solution 1
I'll start by saying this example is adapted from the example for Office365-REST-Python-Client. It works with sharepoint online using the rest api.
Example url you might want to upload to [baseurl][site][folder][file]. https://your_company.sharepoint.com/path/to/site/Shared Documents/file.txt
from office365.runtime.auth.authentication_context import AuthenticationContext
from office365.sharepoint.client_context import ClientContext
baseurl = 'https://your_company.sharepoint.com'
basesite = '/path/to/site' # every share point has a home.
siteurl = baseurl + basesite
localpath = ./file.txt
remotepath = Shared Documents/file.txt # existing folder path under sharepoint site.
ctx_auth = AuthenticationContext(url)
ctx_auth.acquire_token_for_user(username, password)
ctx = ClientContext(siteurl, ctx_auth) # make sure you auth to the siteurl.
with open(localpath, 'rb') as content_file:
file_content = content_file.read()
dir, name = os.path.split(remotepath)
file = ctx.web.get_folder_by_server_relative_url(dir).upload_file(name, file_content).execute_query()
Solution 2
haufe.sharepoint
only works for sharepoint lists, but you probably need access to document libraries.
You should use Python Requests with the help of Sharepoint's REST API.
If your sharepoint site doesn't support BasicAuth I recommend the requests_ntlm
package.
It didn't work for me due to other reasons, but maybe it helps you out a bit.
Solution 3
You could upload files with SharePlum
install SharePlum: pip install SharePlum
and try the code below
import requests
from shareplum import Office365
# Set Login Info
username = '<username>'
password = '<password>'
site_name = '<site_name>'
base_path = 'https://<domain_name>.sharepoint.com'
doc_library = 'Shared%20Documents'
nested_folder = 'Shared%20Documents/<folder1>/<folder2>' #if you want to upload in nested folders else nested_folder = doc_library
file_name = "my_file.zip" #when your file in the same directory
# Obtain auth cookie
authcookie = Office365(base_path, username=username, password=password).GetCookies()
session = requests.Session()
session.cookies = authcookie
session.headers.update({'user-agent': 'python_bite/v1'})
session.headers.update({'accept': 'application/json;odata=verbose'})
session.headers.update({'X-RequestDigest': 'FormDigestValue'})
response = session.post(url=base_path + "/sites/" + site_name + "/_api/web/GetFolderByServerRelativeUrl('" + doc_library + "')/Files/add(url='a.txt',overwrite=true)",
data="")
session.headers.update({'X-RequestDigest': response.headers['X-RequestDigest']})
# Upload file
with open(file_name, 'rb') as file_input:
try:
response = session.post(
url=base_path + "/sites/" + site_name + f"/_api/web/GetFolderByServerRelativeUrl('" + nested_folder + "')/Files/add(url='"
+ file_name + "',overwrite=true)",
data=file_input)
print("response: ", response.status_code) #it returns 200
if response.status_code == '200':
print("File uploaded successfully")
except Exception as err:
print("Something went wrong: " + str(err))
print('File Uploaded Successfully')
Solution 4
I think I might be a bit late in answering this question.
The following solution worked for me-
In the Sharepoint webpage, Go to Library Tools>> Library>> Open with Explorer Command( Its the tiny icon in the bottom right beside Connect to Office command.
The address bar gives us the address that we need to upload the file to. Remember to remove "http:" or "https:" from the address This address is your destination to upload the file.
Subsequently you can use shutil package to upload the file.
import shutil as sl
sl.copy(source,destination)
This should help you upload files to Sharepoint
Disclaimer- This works quite well in Python 3.6
Solution 5
The answers above didn't work for me. I have found a simple and nice way by just mapping a drive to my sharepoint folder and then I used a copy to that drive.
import subprocess
import shutil
subprocess.call(r'net use Y: http://sharepoint/link/to/your/folder', shell=True)
shutil.copy("link_to_local_file","Y:\\")
Instead of copy, You can also delete files or do anything like a normal folder.
Related videos on Youtube
user3590460
Updated on August 15, 2022Comments
-
user3590460 over 1 year
Is there a way to upload a file on sharepoint site using python script? I tried installing haufe.sharepoint, but it seems like it failed to fetch ntlm while it was installing, and I can't even use the connector module without having ntlm installed.
I've also tried just saving the excel file to the server location (so save it to directory like \server\sharepointsite\files instead of connecting via the URL) using openpyxl, but it looks like the file remains checked out after the file is saved..
I would appreciate any help. Thanks!!
-
Kartheek Palepu over 6 yearsTry this
-
-
mechanical_meat about 7 yearsMay I ask why it didn't work for you? +1 by the way.
-
mah65 over 4 yearsThis does not work for me. What is "net use Y:" ?!?
-
Vincent Bénet almost 4 yearsHi @Michelone, Could you please add an example, to your code. What it 'NAME-LIST'? Thanks!
-
Michele almost 4 yearsHi @VincentBénet sorry it was my mistake is not ('NAME-LIST') is ID of the row into sharepoint
-
Idleguys almost 4 years@Mikus I got this error, when I tried with your suggestion.. FileNotFoundError: [Errno 2] No such file or directory: 'Y:\\'
-
shreesh katti about 3 yearsWorked for me. Thank you for this Answer Nurealam. But 1. How do I specify the nested_folder which is not created and expect it to save by creating the nested folder if it does not exist. 2. Is this method a safe way to send the request over the internet ?
-
nurealam siddiq about 3 years1. You might want to create a folder separately before defining the nested folder (check here how to create a folder: pypi.org/project/SharePlum), the above code doesn't create folders automatically and you will get an error. 2. Yes it is safe, I wouldn't use otherwise. You also could use client_secret and client_id if you are not comfortable to use it @shreeshkatti.
-
Krishna almost 3 yearsNote: You might not have access to
abc.sharepoint.com
, you can access your own environment atabc-my.sharepoint.com
. -
Mujeeb over 2 yearsUse
pip install office365-rest-client
to install the package.pip install office365
won't work. Details here, github.com/vgrem/Office365-REST-Python-Client/issues/255 -
Graham Monkman about 2 yearsThis sounds like it must be with a network local impementation. Can you give an example of what the address looks like? Certainly doesnt work on a Microsoft SaaS sharepoint implementaiton.