PyDrive - 擦除文件内容
PyDrive - Erase contents of a file
考虑以下使用 PyDrive 模块的代码:
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)
file = drive.CreateFile({'title': 'test.txt'})
file.Upload()
file.SetContentString('hello')
file.Upload()
file.SetContentString('')
file.Upload() # This throws an exception.
创建文件并更改其内容工作正常,直到我尝试通过将内容字符串设置为空字符串来擦除内容。这样做会引发此异常:
pydrive.files.ApiRequestError
<HttpError 400 when requesting
https://www.googleapis.com/upload/drive/v2/files/{LONG_ID}?alt=json&uploadType=resumable
returned "Bad Request">
当我查看我的云端硬盘时,我看到 test.txt 文件已成功创建,其中包含文本 hello
。但是我预计它会是空的。
如果我将空字符串更改为任何其他文本,文件将被更改两次而不会出现错误。虽然这并没有清除内容,所以这不是我想要的。
在网上查找错误时,我在 PyDrive github 上发现了这个 issue 可能是相关的,虽然它仍然没有解决将近一年。
如果您想重现该错误,您必须按照 PyDrive 文档中的 tutorial 创建您自己的使用 Google Drive API 的项目。
如何通过 PyDrive 擦除文件的内容?
问题和解决方法:
使用resumable=True
时,好像0
字节的数据不能用。所以在这种情况下,需要上传空数据而不使用resumable=True
。但是看了PyDrive的脚本,好像默认使用resumable=True
。 Ref 所以在这种情况下,作为解决方法,我想建议使用 requests
模块。从 PyDrive 的 gauth
检索访问令牌。
当你的脚本修改后,变成如下。
修改后的脚本:
import io
import requests
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)
file = drive.CreateFile({'title': 'test.txt'})
file.Upload()
file.SetContentString('hello')
file.Upload()
# file.SetContentString()
# file.Upload() # This throws an exception.
# I added below script.
res = requests.patch(
"https://www.googleapis.com/upload/drive/v3/files/" + file['id'] + "?uploadType=multipart",
headers={"Authorization": "Bearer " + gauth.credentials.token_response['access_token']},
files={
'data': ('metadata', '{}', 'application/json'),
'file': io.BytesIO()
}
)
print(res.text)
参考文献:
考虑以下使用 PyDrive 模块的代码:
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)
file = drive.CreateFile({'title': 'test.txt'})
file.Upload()
file.SetContentString('hello')
file.Upload()
file.SetContentString('')
file.Upload() # This throws an exception.
创建文件并更改其内容工作正常,直到我尝试通过将内容字符串设置为空字符串来擦除内容。这样做会引发此异常:
pydrive.files.ApiRequestError
<HttpError 400 when requesting
https://www.googleapis.com/upload/drive/v2/files/{LONG_ID}?alt=json&uploadType=resumable
returned "Bad Request">
当我查看我的云端硬盘时,我看到 test.txt 文件已成功创建,其中包含文本 hello
。但是我预计它会是空的。
如果我将空字符串更改为任何其他文本,文件将被更改两次而不会出现错误。虽然这并没有清除内容,所以这不是我想要的。
在网上查找错误时,我在 PyDrive github 上发现了这个 issue 可能是相关的,虽然它仍然没有解决将近一年。
如果您想重现该错误,您必须按照 PyDrive 文档中的 tutorial 创建您自己的使用 Google Drive API 的项目。
如何通过 PyDrive 擦除文件的内容?
问题和解决方法:
使用resumable=True
时,好像0
字节的数据不能用。所以在这种情况下,需要上传空数据而不使用resumable=True
。但是看了PyDrive的脚本,好像默认使用resumable=True
。 Ref 所以在这种情况下,作为解决方法,我想建议使用 requests
模块。从 PyDrive 的 gauth
检索访问令牌。
当你的脚本修改后,变成如下。
修改后的脚本:
import io
import requests
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)
file = drive.CreateFile({'title': 'test.txt'})
file.Upload()
file.SetContentString('hello')
file.Upload()
# file.SetContentString()
# file.Upload() # This throws an exception.
# I added below script.
res = requests.patch(
"https://www.googleapis.com/upload/drive/v3/files/" + file['id'] + "?uploadType=multipart",
headers={"Authorization": "Bearer " + gauth.credentials.token_response['access_token']},
files={
'data': ('metadata', '{}', 'application/json'),
'file': io.BytesIO()
}
)
print(res.text)