#python #python-3.x #google-drive-api #pydrive
#python #python-3.x #google-drive-api #pydrive
Вопрос:
Рассмотрим следующий код, который использует модуль 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=jsonamp;uploadType=resumable
returned "Bad Request">
Когда я смотрю на свой диск, я вижуtest.txt файл успешно создан с текстом hello
в нем. Однако я ожидал, что он будет пустым.
Если я изменю пустую строку на любой другой текст, файл будет изменен дважды без ошибок. Хотя это не очищает содержимое, поэтому это не то, что я хочу.
Когда я искал ошибку в Интернете, я обнаружил эту проблему на PyDrive github, которая может быть связана, хотя она остается нерешенной почти год.
Если вы хотите воспроизвести ошибку, вам необходимо создать свой собственный проект, который использует Google Drive API, следуя этому руководству из документов PyDrive.
Как можно стереть содержимое файла через PyDrive?
Ответ №1:
Проблема и обходной путь:
Когда resumable=True
используется, кажется, что данные 0
байта не могут быть использованы. Таким образом, в этом случае требуется загрузить пустые данные без использования resumable=True
. Но когда я увидел скрипт PyDrive, кажется, что resumable=True
используется по умолчанию. Ссылка Итак, в этом случае, в качестве обходного пути, я хотел бы предложить использовать requests
модуль. Маркер доступа извлекается из gauth
из PyDrive.
Когда ваш скрипт модифицируется, он становится следующим.
Модифицированный скрипт:
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)