Working with Files¶
Upload, download, copy, move, delete, share, and manage files in SharePoint document libraries — the everyday operations for building on top of documents.
Files live inside document libraries, organized in folders. Separately,
list items can have attachments — see
listitems/attachments/ for those.
graph TD
subgraph Site
Library["Document Library e.g. Shared Documents"]
end
subgraph Library
Folder["Folder"]
File["File"]
Folder --> File
end
Library --> Folder
Library --> File
Authentication¶
SharePoint's /_api app-only flow does not accept a client secret — use a
delegated sign-in (username & password, no MFA) or a client certificate for
app-only automation. The examples here use username & password:
from office365.sharepoint.client_context import ClientContext
ctx = ClientContext("https://contoso.sharepoint.com/sites/team").with_username_and_password(
tenant="contoso.onmicrosoft.com", client_id="client_id", username="user@contoso.com", password="password"
)
with_client_secret(...)is a common mistake for SharePoint. It works for Microsoft Graph, but not forClientContext— usewith_username_and_password(below) orwith_client_certificate(...)(app-only). Seeauth/for the full matrix.
Quick start¶
Upload a small file, then download it back:
# Upload a file (< 4 MB)
with open("./report.docx", "rb") as f:
uploaded = ctx.web.default_document_library().root_folder.upload_file("report.docx", f.read()).execute_query()
print(f"Uploaded: {uploaded.server_relative_url}")
# Download it back
downloaded = uploaded.get_content().execute_query()
print(f"Downloaded: {len(downloaded.content)} bytes")
Upload¶
| What | File | Notes |
|---|---|---|
| Upload a small file | upload.py |
File < 4 MB |
| Upload a large file | upload_large.py |
Chunked upload session |
| Upload with checksum | upload_with_checksum.py |
MD5 verification |
| Upload CSV data | upload_csv.py |
Data files |
| Upload JSON data | upload_json.py |
Data files |
| Replace content | replace.py |
Overwrite via binary stream |
Download¶
| What | File | Notes |
|---|---|---|
| Download a file | download.py |
To disk |
| Download a large file | download_large.py |
Streaming with progress |
| Download by URL | download_from_url.py |
Absolute URL |
| Download a whole library | download_from_lib.py |
Every file, preserving folders |
| Download most recent | download_recent.py |
Latest uploaded file |
| Download a version | download_versions.py |
A specific file version |
| Read bytes in memory | get_content.py |
Without touching disk |
# Download to a local file
with open("report.docx", "wb") as f:
ctx.web.get_file_by_server_relative_path("Shared Documents/report.docx").download(f).execute_query()
Bulk operations¶
The highest-leverage scripts for migrations and backups:
| What | File | Notes |
|---|---|---|
| Upload many files in one batch | upload_batch.py |
execute_batch, one request per batch |
| Zip a folder incl. version history | download_folder_with_versions.py |
Current content + every previous version |
# Bulk upload: queue, then flush in one batch request
for name in os.listdir("./data"):
with open(f"./data/{name}", "rb") as f:
target_folder.upload_file(name, f.read()) # queue
ctx.execute_batch() # one request per batch
# Backup a folder with its full version history
with open("archive.zip", "wb") as f:
folder.download_folder(f, include_versions=True).execute_query()
Copy & Move¶
| What | File | Notes |
|---|---|---|
| Copy to another folder | copy_file.py |
|
| Copy and rename | copy_file_with_name.py |
|
| Copy by path | copy_using_path.py |
Server-relative paths |
| Move | move_file.py |
Between folders |
Delete¶
| What | File | Notes |
|---|---|---|
| Delete / recycle | delete.py |
Permanent or recycle bin |
Metadata & Browse¶
| What | File | Notes |
|---|---|---|
| Basic properties | get_props.py |
Name, size, URL, timestamps |
| Extended properties | get_extended_props.py |
Every list-item field |
| System metadata | get_system_metadata.py |
Author, modified-by, created |
| Check existence | exists.py |
|
| Enumerate a library | get_all_items.py |
Files and folders |
| Recently modified | get_recent_files.py |
|
| Pre-authorized download URL | get_download_link.py |
Time-limited link |
Check Out & Approvals¶
For libraries with required check-out or content approval:
| What | File | Notes |
|---|---|---|
| Check out / in | checkout_checkin.py |
Lock, edit, release |
| Checked-out files | get_checked_out.py |
Who has files locked |
| Checkout type | get_checkout_type.py |
Status of one file |
| Publish / unpublish | publish_unpublish.py |
Submit for approval |
| Approve / deny | approve_deny.py |
Review submitted files |
Locked files (open in Office)¶
A file open in Office holds a shared lock — different from a check-out
lock. An overwrite fails with SPFileLockedException (HTTP 423), because the
API cannot break a shared lock. The library makes the failure catchable and
offers opt-in remedies:
| What | File | Notes |
|---|---|---|
| Retry / metadata / bypass delete | handle_locked_file.py |
retry_on(FileLockedException), update_ex(bypass_shared_lock=True), delete_object(bypass_shared_lock=True) |
Sharing¶
| What | File | Notes |
|---|---|---|
| Resolve a sharing link | get_by_sharing_link.py |
Link → file |
| Download via shared link | download_by_shared_link.py |
Guest / anonymous link |
Create Documents¶
| What | File | Notes |
|---|---|---|
| Excel workbook | create_excel.py |
|
| Word document | create_word.py |
|
| Wiki page | create_wiki.py |
|
| Rename a file | rename_page.py |
Permissions¶
| What | File | Notes |
|---|---|---|
| Effective permissions | permissions/get.py |
For a file |
| Per-user permissions | permissions/list.py |
|
| Check a specific access | permissions/check.py |
Does a user have access? |
| Grant permissions | permissions/assign.py |
Role assignment |
Versions¶
| What | File | Notes |
|---|---|---|
| List versions | versions/list.py |
|
| Get by label | versions/get_by_label.py |
A specific version |
| Delete / recycle versions | versions/delete.py |
Keep N / delete all; retry + timeout for large files |
| Restore a version | restore_version.py |
Roll back |
DataFrames¶
Read/write a file's content as a pandas DataFrame (CSV/XLSX/JSON/Parquet);
file metadata stays as plain properties (file.name, file.length, ...).
| What | File | Notes |
|---|---|---|
| Write a DataFrame to a library file | write_dataframe.py |
CSV (UTF-8 BOM) or XLSX; symmetric read via Folder.read_dataframe / File.read_dataframe |
Audit & Compliance¶
| What | File | Notes |
|---|---|---|
| Sensitivity-label baseline | find_label_downgrades.py |
Purview labels (via Graph) |
| Unused files | find_unused_files.py |
No user access in N days |
| Version storage report | version_storage_report.py |
Version count & storage cost |
Attachments¶
Attachments are files attached to list items, not documents in a library —
see listitems/attachments/ for upload, download,
list, and delete operations.
API reference¶
More examples¶
| Script | What it does |
|---|---|
download_parallel.py |
Parallel download of SharePoint files with ThreadPoolExecutor. |
download_with_progress.py |
Download a folder into a zip archive with a tqdm progress bar. |
list_large_folder.py |
List every file in a folder that contains more than 5,000 items. |
upload_with_progress.py |
Upload a large file with a tqdm progress bar. |