92691


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

**フォルダの階層**

[code]

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

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

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

エラー内容

[code]

    GoogleDriveFile({'parents': [{'id': '1J8TXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'}], 'title': 'upload'})
    Traceback (most recent call last):
      File "c:\Users\test\Documents\google drvie\googledrive_file_up.py", line 43, in <module>
        f.SetContentFile(os.path.join(path,x))
      File "C:\Users\test\AppData\Roaming\Python\Python39\site-packages\pydrive\files.py", line 169, in SetContentFile
        self.content = open(filename, 'rb')
    PermissionError: [Errno 13] Permission denied: 'C:\\Users\\test\\Documents\\google drvie\\test\\upload'
    
[/code]

参考ページ  
[Python, PyDriveでGoogle Driveのフォルダ作成、ファイル移動、一括処理](https://note.nkmk.me/python-
pydrive-folder/)

[PythonでGoogle Driveにファイルをアップロードする](https://laboratory.kazuuu.net/upload-
files-to-google-drive-with-python/)

コード

[code]

    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
    
    
[/code]

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


CC BY-SA 4.0
2022-12-11T03:51:40.980
92688
2022-12-11T07:54:47.217
2022-12-11T05:03:26.643
3060
55416
question
python python3 pydrive
PythonでGoogle Driveにフォルダごとでアップロードしたい


恐らく Google Drive API には「フォルダのアップロード」を行う機能が備わっていません。

そのため、(複数の階層を含む) フォルダをアップロードしたい場合には、自前で以下のような流れでの対応が必要になってきます。

  * ローカルのファイル一覧を取得
  * Google Drive 上にフォルダが存在するかチェックし、必要に応じて作成
  * 指定のフォルダにアップロード

長くなるので引用は控えますが、例えば以下の記事の内容が参考になるかと思います。

**参考:**  
[pyDriveを使ってGoogle
Driveにフォルダをアップロード](https://northshorequantum.com/archives/pydrive_upload)


CC BY-SA 4.0
2022-12-11T05:02:42.930
92691
2022-12-11T05:02:42.930
3060
92688
answer


[colab](https://colab.research.google.com/) を使う方法

まずあらかじめ対象の複数のファイルをアーカイブしておく  
(zip でも tar でも, どちらでも可)

colab の左サイドの「ファイル」から

  1. アーカイブしておいた zip tar などをアップロード
  2. ドライブをマウント
  3. あとはセルを用意し展開

展開は, colabのセルを用意し, 以下のように(どちらか) 実行

[code]

    !unzip ZIPFILE.zip -d /content/drive/MyDrive/
    
    !tar xf TARFILE.tar -C /content/drive/MyDrive/
    
[/code]

* * *

定期的なアップロードの場合は

  * HTTPサーバーを用意し, ファイル取得可能にしておく
  * Colab Pro を検討する

以下サンプル, 適当。(マウントの認証は自動化できない)

[code]

    from google.colab import drive
    drive.mount('/content/drive')
    
    for _ in range(10):
        # HTTPサーバーからファイル取得
        !wget ...
     
        # 展開
        !unzip
        # もしくは zipfile モジュール使って展開
    
        time.sleep(3600)
    
[/code]


CC BY-SA 4.0
2022-12-11T07:54:47.217
92699
2022-12-11T07:54:47.217
43025
92688
answer