Как исправить Python в объекте типа datetime - это не JSON сериализуемая ошибка - PullRequest
0 голосов
/ 07 апреля 2020

Я использую интеллектуальный анализ данных в твиттере. Поэтому я получаю значение create_at из твиттера, чтобы сохранить его в файле excel после того, как отправил файл excel на страницу Google, но не может его отправить.
Ошибка:

response = service.spreadsheets().values().append(
File "C:\Users\What Name\AppData\Local\Programs\Python\Python38-32\lib\site- 
packages\googleapiclient\discovery.py", line 830, in method
headers, params, query, body = model.request(
File "C:\Users\What Name\AppData\Local\Programs\Python\Python38-32\lib\site- 
packages\googleapiclient\model.py", line 161, in request
body_value = self.serialize(body_value)
File "C:\Users\What Name\AppData\Local\Programs\Python\Python38-32\lib\site- 
packages\googleapiclient\model.py", line 274, in serialize
return json.dumps(body_value)
File "C:\Users\What Name\AppData\Local\Programs\Python\Python38-32\lib\json\__init__.py", line 231, 
in dumps
return _default_encoder.encode(obj)
File "C:\Users\What Name\AppData\Local\Programs\Python\Python38-32\lib\json\encoder.py", line 199, in 
encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Users\What Name\AppData\Local\Programs\Python\Python38-32\lib\json\encoder.py", line 257, in 
iterencode
return _iterencode(o, 0)
File "C:\Users\What Name\AppData\Local\Programs\Python\Python38-32\lib\json\encoder.py", line 179, in 
default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type datetime is not JSON serializable

Или может быть проблема есть этот код?

xlApp = win32.Dispatch('Excel.Application')
wb = xlApp.Workbooks.Open(r"F:\work\feen\WU\twitter.xlsx")
ws = wb.WorkSheets('Sheet1')
rngData = ws.Range('A1').CurrentRegion()

gsheet_id = 'sheet_id'
CLIENT_SECRET_FILE = 'credentials2.json'
API_SERVICE_NAME = 'sheets'
API_VERSION = 'v4'
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

service = Create_Service(CLIENT_SECRET_FILE,API_SERVICE_NAME,API_VERSION,SCOPES)
response = service.spreadsheets().values().append(
  spreadsheetId=gsheet_id,
  valueInputOption='RAW',
  range='data1!A1',
   body=dict(
      majorDimension='ROWS',
      values=rngData
  )
).execute()

wb.Close(r"F:\work\feen\WU\twitter.xlsx")

1 Ответ

1 голос
/ 07 апреля 2020

Ответ:

Чтобы исправить ошибку Object of type datetime is not JSON serializable, необходимо преобразовать все экземпляры datetime объектов в вашем объекте в string.

Есть и другие ошибки в вашем коде, однако, это означает, что это само по себе не будет запускать вашу программу.

Преобразование объектов datetime в string объекты:

В python вы можете напрямую преобразовать данные JSON в строку, используя json.dumps() со стандартным преобразованием строки.

Это можно сделать, добавив эту строку перед service.spreadsheets().values().append() вызов:

//rngData at this point has already been assigned
rngData = json.dumps(rngData, indent = 4, sort_keys = True, default = str)

Примечание: это само по себе не исправит ваш код!

Другие вопросы:

При совершении вызовов для API Google Sheets очень важно, чтобы вы выполняли запросы так, как их ожидают серверы. То есть важно следовать документации для выполнения запросов.

Я на linux машине, и поэтому я не могу проверить формат вывода win32.Dispatch().Workbooks.Open().Worksheets().Range().CurrentRegion(), но если документация Microsoft по свойству Worksheet.Range в Excel соответствует значению go, я могу смело предположить, что его вывод не соответствует формату, требуемому для spreadsheets.values.append метод :

массив (формат ListValue):

Данные, которые были прочитаны или должны быть записаны. Это массив массивов, внешний массив представляет все данные, а каждый внутренний массив представляет главное измерение. Каждый элемент во внутреннем массиве соответствует одной ячейке.

Для вывода пустые конечные строки и столбцы не будут включены.

Для ввода поддерживаются следующие типы значений: bool, string и double , Нулевые значения будут пропущены. Чтобы установить пустое значение для ячейки, установите для строкового значения пустую строку.

Я не уверен на 100%, совпадают ли выходные данные, но попытаться эмулировать то, что вы пытаясь использовать пакет python xlrd, чтобы получить значения из файла Excel, который вы предоставили, следующим образом:

workbook = xlrd.open_workbook("twitter.xlsx")
sheet = workbook.sheet_by_index(0)
data = [sheet.row_values(rowx) for rowx in range(sheet.nrows)]

И, как на скриншоте, который вы предоставили в комментарии (см. ниже):

screenshot of OP's terminal

У меня был такой же ответ. При прокрутке вверх произошла ошибка из-за неправильного запроса:

googleapiclient.errors.HttpError: <HttpError 400 when requesting https://sheets.googleapis.com/v4/spreadsheets/XXXXX/values/Sheet1%21A1:append?alt=json&valueInputOption=RAW returned "Invalid value at 'data.values' (type.googleapis.com/google.protobuf.ListValue)..."

, в частности, Invalid value at 'data.values'. Для этого метода вам нужно будет придерживаться спецификации запросов Google Sheets API .

Надеюсь, это вам пригодится!

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...