Office365-rest-python-client: كيف يمكنني تنزيل مجلد SharePoint يحتوي على ملفات متعددة؟

تم إنشاؤها على ٢٧ مارس ٢٠١٩  ·  15تعليقات  ·  مصدر: vgrem/Office365-REST-Python-Client

كود My Python 3:

من office365.runtime.auth.authentication_context استيراد AuthenticationContext
من office365.sharepoint.client_context استيراد ClientContext

url = ' https://company.sharepoint.com/sites/abc '
ctx_auth = AuthenticationContext (url = url)
إذا كان ctx_auth.acquire_token_for_user (username='[email protected] '، كلمة المرور =' 12345 '):
ctx = ClientContext (عنوان url ، ctx_auth)
القوائم = ctx.web.lists
ctx.load (القوائم)
ctx.execute_query ()
ل في القوائم:
طباعة (l.properties ['Title'])

من الكود أعلاه ، يمكنني سرد ​​العناصر الموجودة في الموقع. لكن خطتي هي تشغيل هذه الوحدة بأكملها في AWS Lambda باستخدام Python والتنزيل من مستندات SharePoint وتخزينها في AWS S3.

يمكن أن يحتوي المجلد على عدة ملفات. أرغب في تنزيل المجلد بأكمله بجميع الملفات. أي شخص فعل هذا؟ أي مساعدة؟ يجب أن يكون رمز العمل مفيدًا جدًا لأنني جديد تمامًا في تجريف الويب!

التعليق الأكثر فائدة

لا تشكرني ،

يسارًا ، لسرد جميع المجلدات داخل مكتبة مستندات المستندات المشتركة ، يمكنك تجربة:

    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"]))

م.

ال 15 كومينتر

أهلا،
ربما يمكنك القيام بذلك في حلقة ، على سبيل المثال:

  1. إرجاع محتويات مكتبة مستندات SharePoint أولاً باستخدام دالة:

listTitle = "المستندات"
site = "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. ثم قم بتنزيل كل ملف عن طريق استدعاء proc ، على سبيل المثال:

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)

myfiles = fncPrintLibraryContents (ctx ، listTitle)

لملفي في ملفاتي:
طباعة ("تنزيل الملف: {0}". تنسيق (myfile.properties ["الاسم"]))
downloadFile (ctx، `myfile.properties [" الاسم "])

م.

الرجاء ، وضع مسافة بادئة للسطرين الأخيرين في حلقة for ، لا يمكنني فعل ذلك على ما يبدو.
م.

مهلا،

شكرا لهذا الرد السريع. أنا قادر على تنزيل الملفات بنجاح ، بالنظر إلى أنه لا بد لي من إعطاء اسم الملف. ولكن ، لكي أتمكن من تنزيل جميع الملفات بشكل متكرر ، أحتاج أولاً إلى سرد جميع الملفات الموجودة في مجلد معين والذي بعد عدة محاولات ، تحصل على أخطاء لم يتم العثور عليها. ربما أخطأ في مكان ما ، لأن مفهومي عن العنوان غير صحيح ، لذلك كلما حاولت إدراج مجلد فرعي من خلال إعطاء هذا الاسم كعنوان ، أفشل. سوف أتصفح التعليمات البرمجية الخاصة بك وأرى ما إذا كان بإمكاني القيام بذلك.

في هذه الأثناء ، رمز التشغيل الحالي الخاص بي (التنزيل يعمل بشكل جيد ، وسرد المجلدات والملفات الخاصة بالجذر يعمل ولكن عندما أعطي أي اسم مجلد محدد بخلاف المستندات ، يفشل في العنوان):

`من office365.runtime.auth.authentication_context استيراد AuthenticationContext
من office365.sharepoint.client_context استيراد ClientContext
من office365.sharepoint.file استيراد ملف
من office365.sharepoint.file_creation_information استيراد FileCreationInformation

def read_folder_and_files (سياق ، list_title):
"" "قراءة مثال مجلد" ""
list_obj = Context.web.lists.get_by_title (list_title)
المجلد = list_obj.root_folder
Context.load (مجلد)
Context.execute_query ()
طباعة ("قائمة url: {0}". تنسيق (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 (سياق):
response = File.open_binary (السياق ، "/ sites / new / Shared Documents / 2011-A / file1.csv")
طباعة (استجابة)
طباعة (محتوى الاستجابة)
مع فتح (r "C: UsersaakashbDownloadstestfile1.csv"، "wb") كـ local_file:
local_file.write (response.content)

ctx = لا شيء
url = ' https://company.sharepoint.com/sites/new '
ctx_auth = AuthenticationContext (url = url)
إذا كان ctx_auth.acquire_token_for_user (username='[email protected] '، كلمة المرور = "12345"):
ctx = ClientContext (عنوان url ، ctx_auth)
read_folder_and_files (ctx ، "المستندات")

طباعة ("إدخال الوظيفة")

download_file (ctx)

طباعة ('وظيفة الخروج') `

1) آسف للهيكل المعطل للرمز الخاص بي الذي أعطيته لك.
2) فقط قمت بتشغيل الكود الخاص بك والتحقق منه ، إنه يفعل بالضبط ما يفعله الكود الخاص بي من حيث الإدراج. إنه يسرد الملفات في الجذر (وليس داخل أي مجلد). لكني أريد أن أفعل الشيء نفسه للمجلدات.
3) أريد أيضًا سرد المجلدات. عندما أستخدم كودvgrem لسرد المجلدات ، فإنه لا يظهر لي مجلدات المستندات ، ولكنه يعرض مجلدات مثل:

اسم المجلد: SitePages
اسم المجلد: مكتبة الأنماط
اسم المجلد: _ الكتالوجات
اسم المجلد: FormServerTemplates
اسم المجلد: _private
اسم المجلد: روابط المشاركة
اسم المجلد: SiteAssets
اسم المجلد: الصور
اسم المجلد: المستندات المشتركة
اسم المجلد: القوائم
اسم المجلد: _cts

وهي ليست من المجلدات الموجودة لدي في SharePoint Doc Lib.

إذن ، باختصار ، كيف يمكنني إدراج مجلدات Doc Lib والملفات الخاصة بها لتنزيلها؟

أهلا،
يرجى إلقاء نظرة على المشكلة هنا: https://github.com/vgrem/Office365-REST-Python-Client/issues/91
على وجه التحديد في السطر الذي يسير مثل هذا:

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

إذا لم يساعد ذلك ، فسأعود إليك لتقديم مزيد من التفاصيل.
م.

... ما قصدته هو استخدام طريقة get_folder_by_server_relative_url بدلاً من get_by_title ، على سبيل المثال

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)

اسمحوا لي أن أعرف إذا كان ذلك يساعد ...

لتنزيل الملفات داخل مجلد TEST داخل مكتبة المستندات المشتركة ، يمكنك على سبيل المثال تغيير الرمز أعلاه لجعله وظيفة ، مثل:

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)

وقم بتغيير وظيفة التنزيل قليلاً ، على سبيل المثال:

def downloadFolderFile (ctx ، اسم الملف):

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)

myfiles = fncGetFolderContents (ctx ، listTitle)

لملفي في ملفاتي:
طباعة ("تنزيل الملف: {0}". تنسيق (myfile.properties ["الاسم"]))
downloadFolderFile (ctx ، myfile.properties ["الاسم"])

وذلك بفضل الكثير رجل! أنتما الاثنان سريعان حقًا في الردود ، بالإضافة إلى أن واجهة برمجة التطبيقات رائعة للغاية!

سأخوضها في أسرع وقت ممكن وأحاول تكرارها. ولكن ، هل هناك طريقة لسرد المجلدات؟ أعني ، آخر كود قدمته سيعمل عندما أعرف اسم المجلد. في حالة أتمتة العملية وإنشاء مجلد جديد والاحتفاظ بالملفات ، فلن يعمل مع المجلد الجديد ، أليس كذلك؟ لهذا السبب أردت أيضًا إدراج مجلد ، فقط في حالة. على أي حال ، يجب أن يعمل الحل الحالي لحالة الاستخدام الخاصة بي.

الكثير من الشكر لكلا منكما. سوف أقوم بالتحديث هنا ، بمجرد تشغيل التجربة.

لا تشكرني ،

يسارًا ، لسرد جميع المجلدات داخل مكتبة مستندات المستندات المشتركة ، يمكنك تجربة:

    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"]))

م.

رائع. نجحت طباعة وتنزيل محتوى المجلد التكراري!

شكرا لك،

يقوم هذا الرمز بتنزيل ملفات pdf التالفة. إنها فارغة - 156 بايت. اي افكار لماذا؟

أحصل أيضًا على ملفات pdf تالفة مع اسم ملف 1 كيلوبايت فقط باستخدام زر cosde أعلاه. اي فكرة؟

أحصل أيضًا على ملفات pdf تالفة باسم ملف 1 كيلوبايت فقط باستخدام الرمز أعلاه. اي فكرة؟

لقد اكتشفت ذلك ، بالنسبة لي كان السبب هو عنوان url النسبي. عندما أحتاج إلى قائمة محتوى المجلد ، لست بحاجة إلى إضافة / sites / sitename / library وما إلى ذلك ، يجب أن تكون / مكتبة. ولكن عندما أقوم بتنزيل الملفات بالفعل ، أحتاج إلى إضافة / sites / sitename / folder / file.

هذا أمر غريب حقًا ، لأنني ما زلت أستطيع الوصول إلى الملفات وتنزيلها دون إضافة / sites / sitename / ، لكن المحتوى تالف بعد ذلك. في الوقت نفسه ، إذا أضفت / sites / sitename / عندما أحصل على محتوى مجلد ، فسيؤدي ذلك إلى حدوث خطأ ، ولا يعمل إلا إذا بدأت عنوان url ذي صلة بمكتبة.

من الغريب أن يقترح كل مورد إضافة / sites / sitename إلى عنوان url النسبي لكل من محتوى المجلد ومحتوى الملف.

شكرا على الاقتراح. هل يمكنك مشاركة رمز العمل النهائي. إذا أردنا تنزيل جميع محتويات المجلد الفرعي مثل / sites / sitename / Documents / somefolder ، فماذا سيكون الرمز النهائي؟

شكرا يا شباب. يساعد هذا في حل الكثير من المشكلات والقضايا التي تواجهها أثناء استخدام حزمة Sharepoint.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات