【问题标题】:Python : download a file from drive in another format using apidrivePython:使用 apidrive 从驱动器以另一种格式下载文件
【发布时间】:2017-10-05 13:52:41
【问题描述】:

第一点:我有一个问题,是否可以使用 Google Drive API 从我的驱动器下载 pdf 文件作为 doc 或任何其他格式? 就像我们可以在驱动器上手动操作一样:打开一个 pdf 文件作为 google 文档并下载它。

编辑: 第二点:我做了什么: 通过快速入门连接到 apidrive。我打开了 Drive API(Step1),并安装了 Google Client Library(step2)。 之后,我尝试使用代码将文件从我的 HD 上传到我的驱动器:

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

#1st authentification
gauth = GoogleAuth()
gauth.LocalWebserverAuth() # Creates local webserver and auto handles 
authentication.
drive = GoogleDrive(gauth)

file1 = drive.CreateFile()
file1.SetContentFile('documt.pdf')
file1.Upload()

我计划的下一步是以不同的格式(例如 .doc)下载我刚刚上传到 drive 的“documt.pdf”。所以我搜索了如何做所以,我找到了以下脚本,即使它没有做我真正想要的(如文档所说),它也只能将 Google 文档下载为 pdf(与我想要的相反) :

file_id = '1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo'
request = drive_service.files().export_media(fileId=file_id,
                                         mimeType='application/pdf')
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
status, done = downloader.next_chunk()
print "Download %d%%." % int(status.progress() * 100)

然而,即使这段代码也显示错误:

Traceback (most recent call last):
File "C:\Users\OU\AppData\Local\Programs\Python\Python36-
32\download_from_drive.py", line 10, in <module>
request = drive_service.files().export_media(fileId=file_id,
NameError: name 'drive_service' is not defined

我的 client_secrets 文件看起来像(不知道它是否与问题有关): {"web":{"client_id":"xxxxx.apps.googleusercontent.com","project_id":"xxxx","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://accounts.google.com/x/oauth2/token","auth_provider_x509_cert_url ":"https://www.googleapis.com/oauth2/v1/c","client_secret":"erm-xxxx","re​​direct_uris":["http://localhost:8080/"],"javascript_origins":["http://localhost:8080"]}}

谁能帮我找到我的问题的答案(第一点),并解决错误(第二点)?

非常感谢你

【问题讨论】:

    标签: python google-drive-api pydrive


    【解决方案1】:

    我认为您的脚本运行良好。但是从NameError: name 'drive_service' is not defined的错误来看,我认为你可以使用Quickstart for Drive API。您对问题的 sn-p 可以用作快速入门的一部分。您的错误是快速入门的service = discovery.build('drive', 'v3', http=http)。在您的情况下,drive_service 的变量在 Quickstart 中是 service。所以使用你的sn-p的流程如下。

    1. 执行Quickstart 的第 1 步和第 2 步。
    2. 对于第 3 步,将 service = discovery.build('drive', 'v3', http=http) 修改为 drive_service = discovery.build('drive', 'v3', http=http)
    3. main()drive_service = discovery.build('drive', 'v3', http=http) 下面的脚本替换为您的sn-p。执行此操作时,请注意脚本的缩进。

    【讨论】:

    • 感谢您的回答。我试图按照你告诉我的去做。但我必须通知您,我已经完成了第 1 步和第 2 步,以便上传一些文件。但现在我想以其他格式(doc,txt ...)从我的驱动器下载。这就是为什么我找到了我在我的问题中发布的脚本。但是,我按照你告诉我的做了,但第三点的代码只是为了连接到驱动器并列出文件。那么您知道如何使用 apidrive 从驱动器下载文件。
    • @Elroum 感谢您的回复。在我的环境中,您的脚本运行良好。那么你能向我们展示你当前的整个剧本吗?如果你能做到,请在你的问题上添加它。届时,请删除您的私人信息。
    • 非常感谢您的努力。好的,我会告诉你我到底做了什么。我会编辑我的问题
    • 你能帮帮我吗?我真的需要尽快解决问题。非常感谢你
    • @Elroum 很抱歉没有提供帮助。
    【解决方案2】:

    最后,我已经回答了我的问题。 对于第一点:不允许将 pdf 作为另一种格式下载。但是,我们可以首先使用 google docs 格式 application/vnd.google-apps.document 上传文件,即使它是 pdf。我会工作得很好。

    第二点:因为第一点问题现在已经解决了,我不需要修复错误。因为我想要的效果非常好。

    【讨论】:

      猜你喜欢
      • 2021-04-24
      • 1970-01-01
      • 2020-08-13
      • 2015-04-24
      • 1970-01-01
      • 2020-08-10
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多