Laden Sie Google Drive-Dateien in Python herunter

Ich habe versucht, Dateien von Google Drive herunterzuladen. Wenn dies funktioniert, denke ich darüber nach, ein System zu erstellen, das nur durch Ablegen der Datei verarbeitet werden kann.

Es gibt offiziell etwas Einfacheres als diesen Artikel. Offizieller Schnellstart (Java, Node, Python) https://developers.google.com/drive/api/v3/quickstart/python

Quelle

Führen Sie den folgenden Python aus. Der erste Lauf erfordert client_secret.json. Bei Erfolg wird token.pickle erstellt. Bei der Ausführung wird jpg, png direkt unter dem Ordner AAA in Google Drive heruntergeladen.

main.py


# -*- coding: utf-8 -*-
from __future__ import print_function
import pickle
import os.path
import io
import sys

# pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.http import MediaIoBaseDownload

SCOPES = ['https://www.googleapis.com/auth/drive']
FOLDER_NAME = 'AAA'

def main():
    # OAuth
    drive = None
    creds = None
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)

    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        elif os.path.exists('client_secret.json'):
            flow = InstalledAppFlow.from_client_secrets_file(
                'client_secret.json', SCOPES)
            creds = flow.run_local_server(port=0)
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)
    
    if creds and creds.valid:
        drive = build('drive', 'v3', credentials=creds)
    if not drive: print('Drive auth failed.')

    # Folfer list
    folders = None
    if drive: 
        results = drive.files().list(
            pageSize=100, 
            fields='nextPageToken, files(id, name)',
            q='name="' + FOLDER_NAME + '" and mimeType="application/vnd.google-apps.folder"'
            ).execute()
        folders = results.get('files', [])
        if not folders: print('No folders found.')

    # File list
    files = None
    if folders:
        query = ''
        for folder in folders:
            if query != '' : query += ' or '
            query += '"' + folder['id'] + '" in parents'
        query = '(' + query + ')'
        query += ' and (name contains ".jpg " or name contains ".png ")'

        results = drive.files().list(
            pageSize=100, 
            fields='nextPageToken, files(id, name)',
            q=query
            ).execute()
        files = results.get('files', [])
        if not files: print('No files found.')

    # Download
    if files:
        for file in files:
            request = drive.files().get_media(fileId=file['id'])
            fh = io.FileIO(file['name'], mode='wb')
            downloader = MediaIoBaseDownload(fh, request)
            done = False
            while not done:
                _, done = downloader.next_chunk()

if __name__ == '__main__':
    main()

Von der Vorbereitung bis zur Ausführung

1. Greifen Sie auf Google APIs zu

https://console.developers.google.com/apis/credentials Melden Sie sich mit Ihrem Google-Konto an. Da die Projekterstellung zum ersten Mal aufgerufen wird, fügen Sie bitte Mein Projekt usw. hinzu.

2. Aktivieren Sie die Google Drive-API

Wählen Sie GoogleDriveAPI aus der Bibliothek aus und aktivieren Sie die API.

3. Erstellen eines OAuth-Zustimmungsbildschirms

Erstellen Sie einen Zustimmungsbildschirm. UserType = Extern Anwendungsname = Geeigneter Name (kann später geändert werden) Andere sind leer und in Ordnung. Der hier angegebene Name wird auf dem Authentifizierungsbildschirm angezeigt.

4. Laden Sie client_secret.json herunter

Erstellen Sie eine OAuth-Client-ID. Wählen Sie unter Anmeldeinformationen erstellen die Option OAuth-Client-ID aus und erstellen Sie sie mit Anwendungstyp = Desktop-App. Klicken Sie nach dem Erstellen auf die Schaltfläche Client-ID herunterladen. Client_secret-xxx.json wird heruntergeladen.

5. Führen Sie die App aus

Führen Sie den obigen Python-Code aus.

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
python main.py

Der Browser wird gestartet. Melden Sie sich daher mit Ihrem Google-Konto an. Wählen Sie unter "Diese App wurde nicht bestätigt" die Option "Details anzeigen" und "Zur unsicheren Seite wechseln". Wenn die Authentifizierung erfolgreich ist, wird token.pickle erstellt. Dies ist erfolgreich, wenn die Datei jpg, png direkt unter dem AAA-Ordner von Google Drive heruntergeladen wird.

Ausführungsergebnis

Ich habe die Datei wie folgt auf Google Drive abgelegt. Laden Sie direkt unter dem Ordner AAA herunter. Beachten Sie, dass Google Drive denselben Ordnernamen und denselben Dateinamen erstellen kann.

Ordner Datei Ergebnis
AAA img1.jpg OK
AAA img1.jpg OK
AAA/AAA img2.jpg OK
AAA/BBB img3.jpg NG
AAA img4.jpg OK
BBB img5.jpg NG
BBB/AAA img6.jpg OK
/ img7.jpg NG

Kommentar

OAuth-Authentifizierung

SCOPES = ['https://www.googleapis.com/auth/drive']
#Wenn Sie bereits einen Token haben
creds = None
if os.path.exists('token.pickle'):
    with open('token.pickle', 'rb') as token:
        creds = pickle.load(token)

if not creds or not creds.valid:
    if creds and creds.expired and creds.refresh_token:
        creds.refresh(Request())
    elif os.path.exists('client_secret.json'):
        
        #Es wird eine Authentifizierungs-URL ausgegeben. Melden Sie sich an und lassen Sie zu
        flow = InstalledAppFlow.from_client_secrets_file(
            'client_secret.json', SCOPES)
        creds = flow.run_local_server(port=0)
    
    #Mit Gurke speichern
    with open('token.pickle', 'wb') as token:
        pickle.dump(creds, token)

SCOPES = ['https://www.googleapis.com/auth/drive'] verfügt über alle Berechtigungen, daher sollten Sie es meiner Meinung nach eingrenzen.

Anfangs habe ich es mit Node geschafft. In diesem Fall URL → Anmelden und Zulassen → Der Code wird angezeigt. Kopieren Sie ihn in die App → Token abrufen. Python ist einfacher. Zum ersten Mal habe ich eine Gurke benutzt. Es scheint, dass Sie das gesamte Objekt (z. B. eine greifbare Klasse) binär speichern können. Ist es Serialisierung in anderen Sprachen? Es scheint bequem.

Liste von Google Drive abrufen

results = drive.files().list(
    #Maximale Anzahl
    pageSize=100, 
    
    #Parameter, die Sie erhalten möchten
    fields='nextPageToken, files(id, name, parents)',
    
    #Abfrage (alle abrufen, wenn nicht angegeben)
    q='name contains ".jpg " or name contains ".png "'
    ).execute()

files = results.get('files', [])
for file in files:
    print(file['name'] +' '+ file['parents'][0])

Eltern ist die ID des übergeordneten Ordners. Wir kennen den Namen des Ordners hier nicht, daher müssen wir die ID separat nachschlagen. Der obige main.py-Code ruft die Datei ab, indem die ID aus dem Ordnernamen abgerufen wird.

Das obige Beispiel wird nach .jpg .png gesucht. Wenn Sie nicht suchen, wird json aufgrund zusätzlicher Dateien groß. Sie können auch nur Ordner durchsuchen, indem Sie mimeType = "application / vnd.google-apps.folder" schreiben.

Diesmal habe ich dies nicht getan, aber wenn pageSize = 100 überschritten wird, muss es mit nextPageToken erneut erfasst werden.

Liste der Parameter für Felddateien ()

Sie können Eltern erhalten, indem Sie fields = 'files (id, name, parent)' in den Code schreiben. Zuerst war ich besorgt, weil ich nicht wusste, was ich spezifizieren sollte. Infolgedessen können Sie alles erhalten, indem Sie mit fields = 'files' ausführen. Wenn Sie alle erhalten, ist Json lang, daher ist es besser, es anzugeben. Ich werde die erhaltenen Ergebnisse veröffentlichen.

{"kind":"drive#file",
"id":"1PTrhGA14N-xxxx",
"name":"img1.jpg ",
"mimeType":"image/jpeg",
"starred":false,
"trashed":false,
"explicitlyTrashed":false,
"parents":["1Jigt87nbz-xxxx"],
"spaces":["drive"],
"version":"1",
"webContentLink":"https://drive.google.com/xxxx",
"webViewLink":"https://drive.google.com/file/xxxx",
"iconLink":"https://drive-thirdparty.xxxx",
"hasThumbnail":true,
"thumbnailVersion":"1",
"viewedByMe":true,
"viewedByMeTime":"2020-05-23T19:13:29.882Z",
"createdTime":"2020-05-23T19:13:29.882Z",
"modifiedTime":"2013-08-13T23:05:18.000Z",
"modifiedByMeTime":"2013-08-13T23:05:18.000Z",
"modifiedByMe":true,
"owners":[{xxxx}],
"lastModifyingUser":{xxxx},
"shared":false,
"ownedByMe":true,
"capabilities":{xx,xx,xx},
"viewersCanCopyContent":true,
"copyRequiresWriterPermission":false,
"writersCanShare":true,
"permissions":[{xxxx}],
"permissionIds":["1485xxxx"],
"originalFilename":"img1.jpg ",
"fullFileExtension":"jpg",
"fileExtension":"jpg",
"md5Checksum":"95c10exxxx",
"size":"492642",
"quotaBytesUsed":"492642",
"headRevisionId":"0BzjG8APx-xxxx",
"imageMediaMetadata":{"width":1920, "height":1200, xx},
"isAppAuthorized":false}

Zusammenfassung

Ich habe versucht, Dateien von Google Drive herunterzuladen. Als ich es tatsächlich versuchte, bemerkte ich verschiedene Dinge. Google Drive befindet sich wie AWS S3 in der Cloud. Es ist nicht so, als würde man nach lokalen Dateien suchen, es hat eine Eigenart. Im Fall von AWS stellen wir Kunden die hier vorbereiteten Artikel zur Verfügung, im Fall von Google Drive übernehmen wir jedoch die Artikel auf Kundenseite. Es scheint also, dass etwas mehr Arbeit erforderlich sein wird. Mit AWS Lambda können Sie etwas persönlich machen.

Recommended Posts

Laden Sie Google Drive-Dateien in Python herunter
Laden Sie Dateien in jedem Format mit Python herunter
Paralleler Download mit Python
Laden Sie Dateien direkt auf Google Drive herunter (mithilfe von Google Colaboratory).
Laden Sie Dateien mit Lambda (Python) auf Google Drive hoch.
Greifen Sie mit Python auf Google Drive zu
Google Drive API-Tipps (Python)
Laden Sie eine JPG-Datei mit der Google Drive-API in Python hoch
So laden Sie Dateien in Google Drive mit Google Colaboratory
So laden Sie Dateien von Selenium of Python in Chrome herunter
Verschieben von CSV-Dateien mit Python Teil 1
Bearbeiten Sie Dateien und Ordner in Python
Umgang mit JSON-Dateien in Python
Sortieren Sie große Textdateien in Python
Laden Sie Python herunter
Lesen Sie Dateien parallel zu Python
Exportieren und Ausgeben von Dateien in Python
Extrahieren Sie mit Python Zeichenfolgen aus Dateien
Ausgabebaumstruktur von Dateien in Python
Geben Sie Anmerkungen für Python2 in Stub-Dateien ein!
Holen Sie sich Google Fit API-Daten in Python
Referenz der INI-Datei in Python oder Ruby
Automatisieren Sie Jobs, indem Sie Dateien in Python bearbeiten
Laden Sie mit Python Dateien im Web herunter
Laden Sie Bilder von der URL-Liste in Python herunter
Lesen und schreiben Sie JSON-Dateien mit Python
Beispiel für den Umgang mit EML-Dateien in Python
Laden Sie Bilder mit Python auf Google Drive hoch
Quadtree in Python --2
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
Erstellen und bearbeiten Sie Tabellenkalkulationen in einem beliebigen Ordner auf Google Drive mit Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3