Office365-rest-python-client: 複数のファイルを含むSharePointフォルダーをダウンロードするにはどうすればよいですか?

作成日 2019年03月27日  ·  15コメント  ·  ソース: vgrem/Office365-REST-Python-Client

私のPython3コード:

office365.runtime.auth.authentication_contextからimportAuthenticationContext
office365.sharepoint.client_contextからimportClientContext

url = ' https://company.sharepoint.com/sites/abc '
ctx_auth = AuthenticationContext(url = url)
ctx_auth.acquire_token_for_user(username = 'abcd.xyz @ company.com'、password = '12345')の場合:
ctx = ClientContext(url、ctx_auth)
リスト= ctx.web.lists
ctx.load(lists)
ctx.execute_query()
リスト内のlの場合:
print(l.properties ['Title'])

上記のコードから、サイト内のアイテムを一覧表示できます。 しかし、私の計画は、Pythonを使用してAWS Lambdaでこのモジュール全体を実行し、SharePointドキュメントからダウンロードして、AWSS3に保存することです。

フォルダには複数のファイルを含めることができます。 すべてのファイルを含むフォルダ全体をダウンロードしたい。 誰かこれをしましたか? 何か助けはありますか? 私はウェブスクレイピングにまったく慣れていないので、実用的なコードは大きな助けになるでしょう!

最も参考になるコメント

私に感謝しないでください、 @ vgremは非難することです:)...そして私はよく

右、共有ドキュメントドキュメントライブラリ内のすべてのフォルダを一覧表示するには、次のことを試してください。

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

NS。

全てのコメント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)

myfiles内のmyfileの場合:
print( "ダウンロードファイル:{0}"。format(myfile.properties ["Name"]))
downloadFile(ctx、 `myfile.properties [" Name "])

NS。

pls、forループの最後の2行をインデントします、私はそれを行うことができないようです。
NS。

おい、

このような迅速な返信をありがとう。 私はファイルを正常にダウンロードすることができます、与えられた、私はファイル名まで与えなければなりません。 ただし、すべてのファイルを再帰的にダウンロードできるようにするには、最初に特定のフォルダーにある既存のファイルをすべて一覧表示する必要があります。これを何度か試した後、「見つかりません」というエラーが発生します。 タイトルの概念が正しくないため、どこかで間違っている可能性があります。そのため、タイトルとしてその名前を付けてサブフォルダーをリストしようとすると、失敗します。 私はあなたのコードを調べて、それができるかどうかを確認します。

その間、現在実行中のコード(ダウンロードは正常に機能し、rootのフォルダーとファイルの一覧表示は機能していますが、タイトルでドキュメント以外の特定のフォルダー名を指定すると失敗します):

`office365.runtime.auth.authentication_contextからimportAuthenticationContext
office365.sharepoint.client_contextからimportClientContext
office365.sharepoint.fileからインポートファイル
office365.sharepoint.file_creation_informationからインポートFileCreationInformation

def read_folder_and_files(context、list_title):
"" "フォルダの例を読む" ""
list_obj = context.web.lists.get_by_title(list_title)
フォルダー= list_obj.root_folder
context.load(folder)
context.execute_query()
print( "リスト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(context):
response = File.open_binary(context、 "/ sites / new / Shared Documents / 2011-A / file1.csv")
印刷(応答)
print(response.content)
open(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 = 'name.surname @ company.com'、password = '12345')の場合:
ctx = ClientContext(url、ctx_auth)
read_folder_and_files(ctx、 'ドキュメント')

print( '関数に入る')

download_file(ctx)

print( 'exiting function') `

1)私があなたに与えた私のコードの壊れた構造について申し訳ありません。
2)コードを実行して確認したところ、リストに関して私のコードが実行していることを正確に実行しています。 ルート内のファイルを一覧表示しています(フォルダー内ではありません)。 しかし、私はフォルダについても同じことをしたいと思います。
3)フォルダも一覧表示したい。 @vgremのフォルダリストのコードを使用すると、ドキュメントのフォルダは表示されませんが、次のようなフォルダが表示されます。

フォルダー名:SitePages
フォルダ名:スタイルライブラリ
フォルダー名:_catalogs
フォルダー名:FormServerTemplates
フォルダー名:_private
フォルダ名:リンクの共有
フォルダー名:SiteAssets
フォルダ名:画像
フォルダ名:共有ドキュメント
フォルダ名:リスト
フォルダー名:_cts

これは、SharePoint DocLibにあるフォルダーではありません。

つまり、ダウンロードするDoc Libフォルダーとそれぞれのファイルを一覧表示するにはどうすればよいですか?

やあ、
ここで問題を見てください: https
特に次のような行で:

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

それでも問題が解決しない場合は、詳細をお知らせします。
NS。

...私が意味したのは、get_by_titleの代わりにget_folder_by_server_relative_urlメソッドを使用することでした。

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)

それが役立つかどうか教えてください...

Shared Documentsライブラリ内の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、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)

myfiles = fncGetFolderContents(ctx、listTitle)

myfiles内のmyfileの場合:
print( "ダウンロードファイル:{0}"。format(myfile.properties ["Name"]))
downloadFolderFile(ctx、myfile.properties ["Name"])

どうもありがとう! 2人は本当に迅速に返信し、APIは絶対に素晴らしいです!

私はそれをできるだけ早く調べて、複製しようとします。 しかし、フォルダを一覧表示する方法はありますか? つまり、フォルダ名がわかっていれば、あなたが提供した最新のコードが機能します。 プロセスを自動化し、新しいフォルダーが作成されてファイルが保持されている場合、新しいフォルダーでは機能しませんよね? そのため、念のため、リストフォルダも必要でした。 とにかく、現在のソリューションは私のユースケースで機能するはずです。

お二人に感謝します。 実験を実行したら、ここで更新します。

私に感謝しないでください、 @ vgremは非難することです:)...そして私はよく

右、共有ドキュメントドキュメントライブラリ内のすべてのフォルダを一覧表示するには、次のことを試してください。

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

NS。

素晴らしい。 反復的なフォルダコンテンツの印刷とダウンロードが機能しました!

ありがとうございました、

このコードは破損したPDFファイルをダウンロードします。 これらは空です-156バイト。 なぜ何かアイデアはありますか?

上記のcosdeを使用すると、ファイル名が1kbしかない破損したPDFファイルも取得します。 何か案が?

上記のコードを使用すると、ファイル名が1kbしかない破損したPDFファイルも取得しています。 何か案が?

私はそれを理解しました、私にとっての理由は相対的なURLでした。 フォルダの内容を一覧表示する必要がある場合、/ sites / sitename / libraryなどを追加する必要はありません。/libraryである必要があります。 しかし、すでにファイルをダウンロードしている場合は、/ sites / sitename / folder / fileを追加する必要があります。

/ sites / sitename /を追加しなくてもファイルにアクセスしてダウンロードできるので、これは本当に奇妙ですが、コンテンツが破損しています。 同時に、フォルダーのコンテンツを取得しているときに/ sites / sitename /を追加すると、エラーがスローされ、ライブラリで相対URLを開始した場合にのみ機能します。

すべてのリソースが、フォルダコンテンツとファイルコンテンツの両方の相対URLに/ sites / sitenameを追加することを提案しているのは奇妙です。

提案をありがとう。 最終的な作業コードを共有できますか。 / sites / sitename / Documents / somefolderのようなサブフォルダーのすべてのコンテンツをダウンロードしたい場合、最終的なコードは何でしょうか?

みんなありがとう。 これは、Sharepointパッケージの使用中に直面する多くの問題や問題を解決するのに役立ちます。

このページは役に立ちましたか?
0 / 5 - 0 評価