from pathlib import Path from O365 import Account from O365.drive import Folder CLIENT_ID = "925f74dc-f96a-4718-9ca7-d6cc3fa43e1e" CLIENT_SECRET = "SS~8Q~QpBZV9toZuwkzW1XGGen2Hn833spNMtdq5" FLOW_TYPE = "credentials" TENANT_ID = "2ad0dff5-07ce-4cc2-a852-99ce8b91c218" USER_ID = "bedner@global-cube.net" # password = "Platinum512!!" def get_remote_files(folder: Folder, prefix=""): res = {} for item in folder.get_items(): name = item.name if prefix != "": name = prefix + "\\" + name if item.is_file: res[name] = item.object_id if item.is_folder: res.update(get_remote_files(item, name)) return res def get_or_create_subfolder(remote_folder: Folder, folder: str): if folder == "": return remote_folder if "\\" in folder: folder, subfolder = folder.split("\\", 1) else: subfolder = "" for f in remote_folder.get_child_folders(): if f.name == folder: return get_or_create_subfolder(f, subfolder) new_folder = remote_folder.create_child_folder(folder) return get_or_create_subfolder(new_folder, subfolder) def main(): account = Account((CLIENT_ID, CLIENT_SECRET), auth_flow_type=FLOW_TYPE, tenant_id=TENANT_ID) account.authenticate() storage = account.storage(resource=USER_ID) my_drive = storage.get_default_drive() remote_folder = my_drive.get_item_by_path("/Keyloop_Datentransfer") # folder.create_child_folder local_folder = Path("datev/export") local_files = set([str(p.relative_to(local_folder)) for p in local_folder.rglob("*") if p.is_file()]) # uploaded_file = remote_folder.upload_file(item="tox.ini") remote_files_dict = get_remote_files(remote_folder) remote_files = set(remote_files_dict.keys()) delete_candidates = remote_files.difference(local_files) create_candidates = local_files.difference(remote_files) for filename in delete_candidates: print(filename) my_drive.get_item(remote_files_dict[filename]).delete() for filename in sorted(create_candidates): print(filename) full_filename = local_folder / filename subfolder = "" if "\\" in filename: subfolder, filename = filename.rsplit("\\", 1) remote_subfolder = get_or_create_subfolder(remote_folder, subfolder) remote_subfolder.upload_file(item=full_filename) if __name__ == "__main__": main()