List every file in a folder that contains more than 5,000 items.¶
Folder.get_files() pages through the folder (and, with --recursive, its
subfolders) using get_all(page_size=2000), so it is not throttled by the
5,000-item list view threshold.
For the list-items route, the equivalent is
lib.items.select(["FileSystemObjectType"]).expand(["File", "Folder"]).get_all()
(see get_all_items.py).
Reference¶
from __future__ import annotations
import argparse
from office365.sharepoint.client_context import ClientContext
from tests.settings import cert_path, cert_thumbprint, client_id, team_site_url, tenant
def main():
parser = argparse.ArgumentParser(description="List all files in a large folder")
parser.add_argument("--folder-url", default="/Shared Documents", help="server-relative folder url")
parser.add_argument("--recursive", action="store_true", help="include subfolders")
parser.add_argument("--page-size", type=int, default=2000, help="items per page (keep <= 5000)")
args = parser.parse_args()
ctx = ClientContext(team_site_url).with_client_certificate(
tenant, client_id=client_id, thumbprint=cert_thumbprint, cert_path=cert_path
)
folder = ctx.web.get_folder_by_server_relative_url(args.folder_url)
files = folder.get_files(recursive=args.recursive, page_size=args.page_size).execute_query()
print(f"Found {len(files)} file(s) in '{args.folder_url}'")
for file in files[:10]:
print(f" {file.name}")
if __name__ == "__main__":
main()