webdevqa.jp.net

Python 3-GoogleドライブAPI:AttributeError: 'Resource'オブジェクトに属性 'children'がありません

コマンドラインフォルダーセレクターを作成しました。フォルダ内のすべてのファイルを一覧表示したい。 service.children()を使用して試しましたが、機能しません。動作しないもの:

files = service.children().list(folderId=file_id).execute()

serviceオブジェクトをインスタンス化するコードは次のとおりです。

service = build('drive', 'v3', http=creds.authorize(Http()))

コードの他の部分が機能しているので、サービスが機能していることがわかります

私は変数file_idは有効なフォルダです。それがそうかもしれないことを知っている誰か?

6
Alve

最近、APIバージョンを2から3にアップグレードしたようです。 Drive API changelog によると、children()リソースはもうありません。予期しない変更が他にもあると思われるので、必ずその変更ログを確認してください。

Pythonクライアントライブラリのドキュメント Drive V

about()aboutリソースを返します。
changes()変更リソースを返します。
channels()チャネルResourceを返します。
comments()コメントリソースを返します。
files()ファイルResourceを返します。
permissions()権限リソースを返します。
replies()返信リソースを返します。
revisions()リビジョンリソースを返します。
teamdrives()teamdrivesリソースを返します。
new_batch_http_request()検出ドキュメントに基づいてBatchHttpRequestオブジェクトを作成します。

移行したくない場合でも、 Drive V2children()リソースがあります。

about()aboutリソースを返します。
apps()アプリのリソースを返します。
changes()変更リソースを返します。
channels()チャネルResourceを返します。
children()子リソースを返します。
comments()コメントリソースを返します。
files()ファイルResourceを返します。
parents()親リソースを返します。
permissions()権限リソースを返します。
properties()プロパティResourceを返します。
realtime()リアルタイムリソースを返します。
replies()返信リソースを返します。
revisions()リビジョンリソースを返します。
teamdrives()teamdrivesリソースを返します。
new_batch_http_request()検出ドキュメントに基づいてBatchHttpRequestオブジェクトを作成します。

したがって、解決策は、ドライブのV2バージョンをビルドすることですREST API:

_service = build('drive', 'v2', ...)
_

または、引き続き_v3_を使用し、コードを更新して、現在必要なfiles()リソースを使用します。

IDがfolderIdのフォルダーの子を適切な引数で要求し、listと_list_next_を呼び出すことができます。

Python3コード:

_kwargs = {
  "q": "{} in parents".format(folderId),
  # Specify what you want in the response as a best practice. This string
  # will only get the files' ids, names, and the ids of any folders that they are in
  "fields": "nextPageToken,incompleteSearch,files(id,parents,name)",
  # Add any other arguments to pass to list()
}
request = service.files().list(**kwargs)
while request is not None:
  response = request.execute()
  # Do stuff with response['files']
  request = service.files().list_next(request, response)
_

参照:

6
tehhowch

多分あなたはservice.files()を使う必要がありますか?

_files = service.files().list(folderId=file_id).execute()
_

またはこのようなもの

_files = service.files().list().execute().get('files', [])
_

get()ではなくlist()で試してください

_service.children().get(folderId=folder_id).execute()
_
0
Druta Ruslan