質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

PythonでGoogle DriveにフォルダーごとでファイルUP

fideo
fideo

総合スコア52

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2回答

0グッド

1クリップ

191閲覧

投稿2022/12/08 09:23

pythonでローカルにあるフォルダーをGoogle Driveにアップロードしたいです。

フォルダー例

フォルダー1階層 C:\Users\test\Documents\google drvie\test\ アップロードしたいフォルダー フォルダー名:upload C:\Users\test\Documents\google drvie\test\upload ※uploadのフォルダーには フォルダー・ファイルの階層まだあります。 uploadの中にある全てのフォルダー・ファイルをアップロードしたいです。

下記のスクリプトで行いましたが、フォルダーごとでアップロードできないです。
ファイルのみであればアップロードできます。

フォルダーごとでアップロードすると下記のアクセス権限のエラーが表示されます。
もし分かる方がいましたら、教えていただけると幸いです。

エラー内容

PermissionError: [Errno 13] Permission denied: 'C:\\Users\\test\\Documents\\google drvie\\test\\upload'.

参考ページ
Python, PyDriveでGoogle Driveのフォルダ作成、ファイル移動、一括処理

PythonでGoogle Driveにファイルをアップロードする

コード

from pydrive.drive import GoogleDrive from pydrive.auth import GoogleAuth import os #Googleサービスを認証 gauth = GoogleAuth() #資格情報ロードするか、存在しない場合は空の資格情報を作成 gauth.LoadCredentialsFile("mycreds.txt") #Googleサービスの資格情報がない場合 if gauth.credentials is None: #ユーザーから認証コードを自動的に受信しローカルWebサーバーを設定 gauth.LocalWebserverAuth() #アクセストークンが存在しないか、期限切れかの場合 elif gauth.access_token_expired: #Googleサービスを認証をリフレッシュする gauth.Refresh() #どちらにも一致しない場合 else: #Googleサービスを承認する gauth.Authorize() #資格情報をtxt形式でファイルに保存する gauth.SaveCredentialsFile("mycreds.txt") #Googleドライブの認証処理 drive = GoogleDrive(gauth) #アップロードするフォルダパス指定 path = r'C:\Users\test\Documents\google drvie\test' #GOOGLE DRIVEにUPするファイルID folder_id='1J8TXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' #for文によるループ処理(繰り返し処理) for x in os.listdir(path): #GoogleDriveFileオブジェクト作成 #f = drive.CreateFile({'title' : x}) f = drive.CreateFile({"parents": [{"id": folder_id},]}) #ファイルのタイトル f['title'] = x #ローカルのファイルをセットしてアップロード print(f) f.SetContentFile(os.path.join(path,x)) print(f) #Googleドライブにアップロード f.Upload() print(f) f = None

お手数ですが、よろしくお願い致します。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

0

自己解決

下記のスクリプトで解決しました。
参考ページ
pyDriveを使ってGoogle Driveにフォルダをアップロード

import os import sys import datetime from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive def auth_gd(): gauth = GoogleAuth() gauth.CommandLineAuth() drive = GoogleDrive(gauth) return drive def upload2googledrive(): drive = auth_gd() parentid = 'xxxxxxxx' #project-root directory path = "/home/static/Data/test" #path to local data # "test"フォルダをGoogle Drive上に作成 t_folder = create_dir(parentid, os.path.basename(path), drive) # ローカルのディレクトリ一覧取得 flag = "" dir_list=get_dirlist(path) for d in dir_list: d_folder = create_dir(t_folder['id'], os.path.basename(d), drive) #ローカルのファイル一覧取得 file_list=get_filelist(d) for f in file_list: upload_file(d_folder['id'], f, drive) # ディレクトリがGoogle Drive上に存在するかどうかをチェックし、 # 存在しなければ作成、すでに存在すれば既存のフォルダを返す def create_dir(pid, fname, drive=None): if drive == None: drive = auth_gd() ret = check_files(pid, fname, drive) if ret == False: folder = drive.CreateFile({'title': fname, 'mimeType': 'application/vnd.google-apps.folder'}) folder['parents']= [{'id': pid}] folder.Upload() else: folder = ret print(folder['title']+" exists") return folder #同じ名前のファイルがGoogle Drive上に存在するかチェックし、 #存在しなければアップロード、存在すれば既存のファイルを返す def upload_file(pid, fname, drive=None): if drive == None: drive = auth_gd() ret = check_files(pid, fname, drive) if ret == False: gf = drive.CreateFile() gf['parents']= [{'id': pid}] gf.SetContentFile(fname) gf['title'] = os.path.basename(fname) gf.Upload() else: gf = ret print(gf['title']+" exists") return gf #Google Drive上にその名前のファイル/フォルダがあるかチェック、なければFalseを、あれば既存のファイル/フォルダを返す def check_files(pid, fname, drive=None): if drive == None: drive = auth_gd() query = '"{}" in parents'.format(pid) query += ' and title = "' + os.path.basename(fname) + '"' list = drive.ListFile({'q': query}).GetList() if len(list)> 0: return list[0] return False def get_dirlist(basedir): ret = [] for path, dirnames, filenames in os.walk(basedir): for dir in sorted(dirnames): d = os.path.join(path, dir) ret.append(d) return ret def get_filelist(basedir): ret = [] for path, dirnames, filenames in os.walk(basedir): for filename in sorted(filenames): fullpath = os.path.join(path, filename) ret.append(fullpath) return ret if __name__ == '__main__': upload2googledrive()

投稿2022/12/21 02:42

fideo

総合スコア52

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

フォルダー自体をアップロードするというよりも、アップロードしたいフォルダーと同じ名前、階層のフォルダをGoogleDrive上に作成し、作成したフォルダ内にアップロードしたいフォルダの中身のファイルをアップロードするようにしましょう。

アップロードしたいフォルダの中にフォルダがある場合は再帰的に処理をする関数にしてあげましょう

投稿2022/12/08 10:04

nonaka-shu

総合スコア45

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

fideo

2022/12/11 03:46

回答ありがとうございます。自動でフォルダをGoogleDrive上に作成できないでしょうか。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。