Python:使用apidrive

时间:2017-10-05 13:52:42

标签: python google-drive-api pydrive

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

编辑: 第二点:我做了什么: 通过快速入门连接到apidrive。我打开了Drive API(Step1),并安装了Google Client Library(步骤2)。 之后,我尝试使用以下代码将文件从我的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()

我的计划的下一步是下载'documt.pdf',我刚刚上传到驱动器,以不同的格式(例如.doc)。所以我搜索了怎么做所以,我发现了以下脚本,即使它没有做我想要的(正如文档所说),它只能下载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文件看起来像(不知道它是否与问题有关): { “网络”:{ “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”, “redirect_uris中”:[ “http://localhost:8080/”], “javascript_origins”:[ “http://localhost:8080” ]}}

任何人都可以帮我找到问题的答案(第一点),并解决错误(第二点)?

非常感谢

2 个答案:

答案 0 :(得分:0)

我认为你的脚本运行正常。但是从NameError: name 'drive_service' is not defined的错误中,我认为您可以使用Quickstart for Drive API。您问题的片段可以用作快速入门的一部分。您的错误是Quickstart的service = discovery.build('drive', 'v3', http=http)。在您的情况下,Quickstart中的drive_service变量为service。因此,使用您的代码段的流程如下:

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

答案 1 :(得分:0)

最后,我回答了我的问题。 第一点:它不允许以另一种格式下载pdf。但是,我们可以首先使用Google文档格式 <LinearLayout android:id="@+id/ll_send_message" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="horizontal" > <EditText android:id="@+id/editMessage" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_gravity="center_vertical|center_horizontal" android:layout_weight="5" android:gravity="top|left" android:inputType="textMultiLine|textCapSentences" android:maxLines="5" android:minLines="3" android:scrollHorizontally="false" /> <Button android:id="@+id/buttonSend" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|center_horizontal" android:gravity="center" android:text="send" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout> </LinearLayout> 上传文件,即使它是pdf格式。我会工作得很好。

关于第二点:因为现在解决了第一点问题,我不需要修复错误。因为我想要的东西非常好。