كود 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.
يمكن أن يحتوي المجلد على عدة ملفات. أرغب في تنزيل المجلد بأكمله بجميع الملفات. أي شخص فعل هذا؟ أي مساعدة؟ يجب أن يكون رمز العمل مفيدًا جدًا لأنني جديد تمامًا في تجريف الويب!
أهلا،
ربما يمكنك القيام بذلك في حلقة ، على سبيل المثال:
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)
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 ، "المستندات")
طباعة ('وظيفة الخروج') `
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.
التعليق الأكثر فائدة
لا تشكرني ،
يسارًا ، لسرد جميع المجلدات داخل مكتبة مستندات المستندات المشتركة ، يمكنك تجربة:
م.