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

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

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

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

Python

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

Q&A

解決済

2回答

1362閲覧

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

fideo

総合スコア55

Python 3.x

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

Python

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

0グッド

1クリップ

投稿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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

総合スコア55

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2022/12/08 10:04

nonaka-shu

総合スコア50

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fideo

2022/12/11 03:46

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問