Office365-rest-python-client: Bagaimana saya bisa mengunduh folder SharePoint yang berisi banyak file?

Dibuat pada 27 Mar 2019  ·  15Komentar  ·  Sumber: vgrem/Office365-REST-Python-Client

Kode Python 3 saya:

dari office365.runtime.auth.authentication_context impor AuthenticationContext
dari office365.sharepoint.client_context impor ClientContext

url = ' https://company.sharepoint.com/sites/abc '
ctx_auth = AuthenticationContext(url=url)
jika ctx_auth.acquire_token_for_user(username='[email protected]', password='12345'):
ctx = ClientContext(url, ctx_auth)
daftar = ctx.web.lists
ctx.load(daftar)
ctx.execute_query()
untuk l dalam daftar:
print(l.properties['Judul'])

Dari kode di atas, saya dapat membuat daftar item di situs. Tetapi rencana saya adalah menjalankan seluruh modul ini di AWS Lambda menggunakan Python dan mengunduh dari Dokumen SharePoint dan menyimpannya di AWS S3.

Sebuah folder dapat memiliki banyak file. Saya ingin mengunduh seluruh folder dengan semua file. Ada yang melakukan ini? Ada bantuan? Kode yang berfungsi akan sangat membantu karena saya benar-benar baru dalam pengikisan web!

Komentar yang paling membantu

Jangan berterima kasih padaku, @vgrem yang harus disalahkan :) ... dan saya tidak yakin, mungkin ada cara lain untuk mencapai hal yang sama ....

benar, untuk membuat daftar semua folder di dalam pustaka dokumen Dokumen Bersama, Anda dapat mencoba:

    list_object = ctx.web.lists.get_by_title(listTitle)
    folder = list_object.root_folder        
    ctx.load(folder)
    ctx.execute_query()

    folders = folder.folders
    ctx.load(folders)
    ctx.execute_query()

    for myfolder in folders:
        print("File name: {0}".format(myfolder.properties["Name"]))

M.

Semua 15 komentar

Hai,
mungkin Anda bisa melakukannya dalam satu lingkaran, misalnya:

  1. kembalikan konten pustaka Dokumen sharepoint terlebih dahulu menggunakan fungsi:

listTitle = "Dokumen"
situs = "abc"

def fncPrintLibraryContents(ctx, listTitle):

try:

    list_object = ctx.web.lists.get_by_title(listTitle)
    folder = list_object.root_folder        
    ctx.load(folder)
    ctx.execute_query()

    files = folder.files
    ctx.load(files)
    ctx.execute_query()

    return files

except:

    print('Problem printing out library contents')   
    sys.exit(1)
  1. kemudian unduh setiap file dengan memanggil proc, misalnya:

def downloadFile(ctx, fileName):

try:
    with open(fileName, "wb") as localFile:            
        relativeUrl = '/sites/{0}/Shared%20Documents/{1}'.format(site, fileName)
        response = File.open_binary(ctx, relativeUrl)
        localFile.write(response.content) 
        localFile.close()

except:

    print('Problem downloading file:', fileName)
    sys.exit(1)

file saya = fncPrintLibraryContents(ctx, listTitle)

untuk file saya di file saya:
print("Mengunduh file: {0}".format(filesaya.properti["Nama"]))
downloadFile(ctx,`myfile.properties["Nama"])

M.

tolong, indentasi dua baris terakhir di for loop, sepertinya saya tidak bisa melakukannya.
M.

Hai,

Terima kasih atas balasan yang begitu cepat. Saya berhasil mengunduh file, mengingat, saya harus memberikan sampai nama file. Tetapi, untuk dapat mengunduh semua file secara rekursif, saya harus terlebih dahulu membuat daftar semua yang ada di folder tertentu yang setelah beberapa kali percobaan, mendapatkan kesalahan Tidak Ditemukan. Mungkin saya salah di suatu tempat, karena konsep Judul saya tidak benar, jadi setiap kali saya mencoba membuat daftar subfolder dengan memberikan nama itu sebagai judul, saya gagal. Saya akan memeriksa kode Anda dan melihat apakah saya bisa melakukannya.

Sementara itu, kode saya saat ini (Mengunduh berfungsi dengan baik, daftar folder dan file untuk root berfungsi tetapi setiap kali di Judul saya memberikan nama folder tertentu selain Dokumen, itu gagal):

`dari office365.runtime.auth.authentication_context impor AuthenticationContext
dari office365.sharepoint.client_context impor ClientContext
dari office365.sharepoint.file impor File
dari office365.sharepoint.file_creation_information impor FileCreationInformation

def read_folder_and_files(konteks, list_title):
"""Baca contoh folder"""
list_obj = context.web.lists.get_by_title(list_title)
folder = list_obj.root_folder
konteks.load(folder)
konteks.execute_query()
print("Daftar url: {0}".format(folder.properties["ServerRelativeUrl"]))

files = folder.files
context.load(files)
context.execute_query()
for cur_file in files:
    print("File name: {0}".format(cur_file.properties["Name"]))

folders = context.web.folders
context.load(folders)
context.execute_query()
for folder in folders:
    print("Folder name: {0}".format(folder.properties["Name"]))

def download_file(konteks):
response = File.open_binary(context, "/sites/new/Shared Documents/2011-A/file1.csv")
cetak (tanggapan)
cetak(respon.konten)
dengan open(r"C:UsersaakashbDownloadstestfile1.csv", "wb") sebagai local_file:
local_file.write(respons.content)

ctx = Tidak ada
url = ' https://company.sharepoint.com/sites/new '
ctx_auth = AuthenticationContext(url=url)
jika ctx_auth.acquire_token_for_user(username='[email protected]', password='12345'):
ctx = ClientContext(url, ctx_auth)
read_folder_and_files(ctx, 'Dokumen')

print('memasukkan fungsi')

unduh_file(ctx)

print('fungsi keluar')`

1) Maaf atas struktur kode saya yang rusak yang saya berikan kepada Anda.
2) Jalankan saja kode Anda dan periksa, itu melakukan persis apa yang dilakukan kode saya dalam hal daftar. Itu mendaftar file di root (tidak di dalam folder apa pun). Tetapi saya ingin melakukan hal yang sama untuk folder.
3) Saya juga ingin membuat daftar folder. Ketika saya menggunakan kode folder daftar @vgrem , itu tidak menunjukkan kepada saya folder Dokumen, tetapi menunjukkan folder seperti:

Nama folder: Halaman Situs
Nama folder: Perpustakaan Gaya
Nama folder: _catalogs
Nama folder: FormServerTemplates
Nama folder: _private
Nama folder: Berbagi Tautan
Nama folder: SiteAssets
Nama folder: gambar
Nama folder: Dokumen Bersama
Nama folder: Daftar
Nama folder: _cts

Yang bukan merupakan folder yang saya miliki di SharePoint Doc Lib.

Jadi, singkatnya, bagaimana saya bisa membuat daftar folder Doc Lib dan file masing-masing untuk diunduh?

Hai,
silakan lihat masalahnya di sini: https://github.com/vgrem/Office365-REST-Python-Client/issues/91
khusus pada baris yang berbunyi seperti ini:

folder = ctx.web.get_folder_by_server_relative_url(app_settings['urlrel'])

Jika tidak membantu maka saya akan menghubungi Anda kembali untuk memberikan detail lebih lanjut.
M.

... yang saya maksud adalah menggunakan metode get_folder_by_server_relative_url alih-alih get_by_title, mis

app_settings = {'urlrel': '/sites/abc/Shared Documents/TEST'}

def printFolderContents(ctx, listTitle):

try:

    #list_object = ctx.web.lists.get_by_title(listTitle)
    folder = ctx.web.get_folder_by_server_relative_url(app_settings['urlrel'])
    #folder = list_object.root_folder        
    ctx.load(folder)
    ctx.execute_query()
    #print(folder.url)

    files = folder.files
    ctx.load(files)
    ctx.execute_query()

    for myfile in files:
        print("File name: {0}".format(myfile.properties["Name"]))

except:

    print('Problem printing out library contents')   
    sys.exit(1)

Beri tahu saya jika itu membantu ...

untuk mengunduh file di dalam folder TEST di dalam pustaka Dokumen Bersama, misalnya, Anda dapat mengubah kode di atas agar berfungsi, seperti:

def fncGetFolderContents(ctx, listTitle):

try:

    #list_object = ctx.web.lists.get_by_title(listTitle)
    folder = ctx.web.get_folder_by_server_relative_url(app_settings['urlrel'])
    #folder = list_object.root_folder        
    ctx.load(folder)
    ctx.execute_query()
    #print(folder.url)

    files = folder.files
    ctx.load(files)
    ctx.execute_query()

    #for myfile in files:
    #    print("File name: {0}".format(myfile.properties["Name"]))

    return files

except:

    print('Problem printing out library contents')   
    sys.exit(1)

dan ubah sedikit fungsi unduh, mis:

def downloadFolderFile(ctx, fileName):

try:
    with open(fileName, "wb") as localFile:            
        relativeUrl = '/sites/{0}/Shared%20Documents/{1}/{2}'.format(site, yourFolder, fileName)
        #relativeUrl = app_settings['urlrel']
        response = File.open_binary(ctx, relativeUrl)
        localFile.write(response.content) 
        localFile.close()

except:

    print('Problem downloading file:', fileName)
    sys.exit(1)

file saya = fncGetFolderContents(ctx, listTitle)

untuk file saya di file saya:
print("Mengunduh file: {0}".format(filesaya.properti["Nama"]))
unduhFolderFile(ctx, myfile.properties["Nama"])

Terima kasih banyak pria! Anda berdua benar-benar cepat dalam membalas, dan juga API-nya benar-benar luar biasa!

Saya akan melakukannya secepatnya dan mencoba untuk meniru. Tapi, apakah ada cara untuk membuat daftar folder? Maksud saya, kode terbaru yang Anda berikan akan berfungsi ketika saya tahu nama foldernya. Jika saya mengotomatiskan proses dan folder baru dibuat dan file disimpan, itu tidak akan berfungsi untuk folder baru, bukan? Itu sebabnya saya juga ingin daftar folder, untuk berjaga-jaga. Bagaimanapun, solusi saat ini harus bekerja untuk kasus penggunaan saya.

Banyak terima kasih untuk kalian berdua. Saya akan memperbarui di sini, setelah saya menjalankan percobaan.

Jangan berterima kasih padaku, @vgrem yang harus disalahkan :) ... dan saya tidak yakin, mungkin ada cara lain untuk mencapai hal yang sama ....

benar, untuk membuat daftar semua folder di dalam pustaka dokumen Dokumen Bersama, Anda dapat mencoba:

    list_object = ctx.web.lists.get_by_title(listTitle)
    folder = list_object.root_folder        
    ctx.load(folder)
    ctx.execute_query()

    folders = folder.folders
    ctx.load(folders)
    ctx.execute_query()

    for myfolder in folders:
        print("File name: {0}".format(myfolder.properties["Name"]))

M.

Fantastis. Pencetakan dan pengunduhan konten folder berulang berhasil!

Terima kasih,

Kode ini mengunduh file pdf yang rusak. Mereka kosong - 156 byte. Ada ide kenapa?

Saya juga mendapatkan file pdf yang rusak dengan nama file hanya 1kb dengan menggunakan kode di atas. Ada ide?

Saya juga mendapatkan file pdf yang rusak dengan nama file hanya 1kb dengan menggunakan kode di atas. Ada ide?

Saya menemukan jawabannya, bagi saya alasannya adalah url relatif. Ketika saya perlu membuat daftar konten folder, saya tidak perlu menambahkan /sites/sitename/library dll., itu hanya harus /library. Tetapi ketika saya sudah mengunduh file, saya perlu menambahkan /sites/sitename/folder/file.

Ini benar-benar aneh, karena saya masih dapat mengakses dan mengunduh file tanpa menambahkan /sites/sitename/, tetapi kontennya rusak. Pada saat yang sama, jika saya menambahkan /sites/sitename/ ketika saya mendapatkan konten folder, itu menimbulkan kesalahan, dan hanya berfungsi jika saya memulai url relatif dengan perpustakaan.

Sungguh aneh bahwa setiap sumber daya menyarankan untuk menambahkan /sites/sitename ke url relatif untuk konten folder dan konten file.

Terima kasih atas sarannya. dapatkah Anda membagikan kode kerja akhir. Jika kita ingin mendownload semua isi dari subfolder seperti /sites/sitename/Documents/somefolder lalu apa kode finalnya?

Terima kasih teman-teman. Ini membantu memecahkan banyak masalah dan masalah yang dihadapi saat menggunakan paket Sharepoint.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat