J'ai vu divers articles qui répondaient à certains de mes souhaits, mais pas à tous. À l'aide de Python, comment télécharger un fichier dans un dossier spécifique sur Google Drive? De plus, je veux m'assurer que le jeton n'expire jamais car je souhaite qu'il s'exécute à partir d'une machine distante.

Modifier J'ai essayé ce qui suit en utilisant un compte de service.

SCOPES = [
        'https://www.googleapis.com/auth/drive'
    ]
SERVICE_ACCOUNT_FILE = 'path/to/local/creds.json'
credentials = service_account.Credentials.from_service_account_file(
            SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = discovery.build('drive', 'v3', credentials=credentials)
SS_SERVICE = build('sheets', 'v4', credentials = credentials)

file_metadata = {
    'name': 'A Test File.csv',
    'parents': [{"kind": "drive#folder",
                 "id":'idoffolder'}],
    'mimeType': 'text/csv'
}
req = service.files().create(body=file_metadata,
                                    media_body='path_to_local_csv')
req.uri = req.uri + '&convert=true'
resp = req.execute()

J'ai récupéré l'identifiant du dossier à partir de l'URL: https://drive.google.com/drive/u/1/folders/ idIwanttouse

Ce code semble fonctionner dans la mesure où il n'y a pas d'erreurs, mais je ne vois pas de fichier appelé A Test File.csv dans le dossier que j'ai spécifié.

Fait intéressant lorsque je lance ce qui suit:

service.files().list().execute()

Je vois le fichier "A Test File.csv" mais aucun autre fichier dans mon compte partagé Google Drive.

Quelques remarques: j'essaie d'ajouter des fichiers à un compte professionnel partagé dont je suis membre, en plus j'utilise un compte de service.

Des idées?

1
ben890 1 mars 2021 à 05:34

1 réponse

Meilleure réponse

Je crois que votre objectif et votre situation actuelle sont les suivants.

  • Vous souhaitez importer un fichier CSV de A Test File.csv dans le dossier spécifique de Google Drive en le convertissant en feuille de calcul Google à l'aide du compte de service.
  • À partir de I see the file "A Test File.csv" but no other files in my google drive shared account., vous souhaitez voir le fichier téléversé sur votre Google Drive.
  • Vous souhaitez y parvenir en utilisant l'API Drive v3 avec googleapis pour python.
  • Vous avez déjà pu utiliser l'API Drive à l'aide du compte de service.

Points de modification:

  • Lorsque vous souhaitez importer un fichier dans un dossier spécifique à l'aide de l'API Drive v3, veuillez définir l'ID de dossier des métadonnées du fichier, tel que 'parents': ['idoffolder'],. Dans votre script, 'parents': [{"kind": "drive#folder","id":'idoffolder'}], est utilisé. Ceci est utilisé pour l'API Drive v2. Je pense que cela pourrait être l'une des raisons de votre problème.
    • Dans ce cas, lorsque vous souhaitez voir le fichier téléchargé dans le dossier spécifique de votre Google Drive, veuillez partager le dossier avec l'adresse e-mail du compte de service. Par cela, vous pouvez le voir. Veuillez faire attention à cela.
  • Pour télécharger un fichier du PC local, veuillez modifier media_body='path_to_local_csv' en media_body=MediaFileUpload("path_to_local_csv", mimetype="text/csv", resumable=True). Je pense que cela pourrait être l'une des raisons de votre problème.
  • Lorsque vous souhaitez télécharger le fichier CSV en le convertissant en feuille de calcul Google, vous pouvez y parvenir en incluant le mimeType dans les métadonnées du fichier.

Lorsque les points ci-dessus sont reflétés dans votre script, cela devient comme suit.

Script modifié:

Avant d'utiliser ce script, veuillez définir et confirmer les variables.

from googleapiclient import discovery
from google.oauth2 import service_account
from apiclient.http import MediaFileUpload

SCOPES = ['https://www.googleapis.com/auth/drive']
SERVICE_ACCOUNT_FILE = 'path/to/local/creds.json'
credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = discovery.build('drive', 'v3', credentials=credentials)
file_metadata = {
    'name': 'A Test File.csv',
    'parents': ['idoffolder'],
    'mimeType': 'application/vnd.google-apps.spreadsheet'
}
media_body = MediaFileUpload('path_to_local_csv', mimetype="text/csv", resumable=True)
resp = service.files().create(body=file_metadata, media_body=media_body, supportsAllDrives=True).execute()
print(resp)
  • Lorsque le script ci-dessus est exécuté, le fichier CSV de path_to_local_csv sur votre PC local est téléversé dans le dossier spécifique idoffolder de Google Drive en tant que feuille de calcul Google.

Remarque:

  • Dans ce script modifié, cela suppose que creds.json de votre compte de service a l'autorisation de télécharger le fichier dans le dossier spécifique.
  • Si vous prévoyez d'utiliser le compte de service pour usurper l'identité de son compte habituel, veuillez vérifier le domaine délégation à l'échelle mondiale.
  • À propos de Additionally, I want to make sure the token never expires as I want it to run from a remote machine., dans le script ci-dessus, le jeton d'accès est récupéré à chaque exécution. Par cela, je pense que ce problème pourrait ne pas se produire.

Les références:

3
Tanaike 7 mars 2021 à 03:40