PyDrive — удаление содержимого файла

#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)
  

Ссылки: