Thanks to visit codestin.com
Credit goes to github.com

Skip to content

TypeError: Object of type timedelta is not JSON serializable #285

@jkirk

Description

@jkirk

I have a simple ods file. This works fine:

❯ pyexcel view pyexcel-timedelta.ods                                    
Sheet1:
+-----------+
| Timedelta |
+-----------+
| 23:00:00  |
+-----------+%                    

When changing 23:00:00 to anything above 24:00:00 this happens:

❯ pyexcel view pyexcel-timedelta.ods
Traceback (most recent call last):
  File "/opt/venv3/bin/pyexcel", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/opt/venv3/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv3/lib/python3.11/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/opt/venv3/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv3/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv3/lib/python3.11/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv3/lib/python3.11/site-packages/click/decorators.py", line 33, in new_func
    return f(get_current_context(), *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv3/lib/python3.11/site-packages/pyexcel_cli/view.py", line 63, in view
    ctx.invoke(transcode, output=output, **keywords)
  File "/opt/venv3/lib/python3.11/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv3/lib/python3.11/site-packages/pyexcel_cli/transcode.py", line 117, in transcode
    pe.save_book_as(**params)
  File "/opt/venv3/lib/python3.11/site-packages/pyexcel/core.py", line 112, in save_book_as
    return sources.save_book(book, **dest_keywords)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv3/lib/python3.11/site-packages/pyexcel/internal/core.py", line 55, in save_book
    return _save_any(a_source, book)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv3/lib/python3.11/site-packages/pyexcel/internal/core.py", line 59, in _save_any
    a_source.write_data(instance)
  File "/opt/venv3/lib/python3.11/site-packages/pyexcel/plugins/sources/output_to_memory.py", line 49, in write_data
    self._renderer.render_book_to_stream(
  File "/opt/venv3/lib/python3.11/site-packages/pyexcel/renderer.py", line 109, in render_book_to_stream
    self.render_book(book, **keywords)
  File "/opt/venv3/lib/python3.11/site-packages/pyexcel/renderer.py", line 130, in render_book
    self.render_sheet(sheet)
  File "/opt/venv3/lib/python3.11/site-packages/pyexcel/plugins/renderers/_texttable.py", line 23, in render_sheet
    content = render_text_table(sheet, self._write_title)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv3/lib/python3.11/site-packages/pyexcel/plugins/renderers/_texttable.py", line 46, in render_text_table
    table.add_row(list(new_array))
                  ^^^^^^^^^^^^^^^
  File "/opt/venv3/lib/python3.11/site-packages/pyexcel/plugins/renderers/_texttable.py", line 56, in _cleanse_a_row
    yield to_format(str, item)
          ^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv3/lib/python3.11/site-packages/pyexcel/internal/sheets/formatters.py", line 130, in to_format
    return func(value, to_type)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/venv3/lib/python3.11/site-packages/pyexcel/internal/sheets/formatters.py", line 112, in default_formatter
    return json.dumps(value)
           ^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/json/encoder.py", line 200, in encode
    chunks = self.iterencode(o, _one_shot=True)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/json/encoder.py", line 258, in iterencode
    return _iterencode(o, 0)
           ^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/json/encoder.py", line 180, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type timedelta is not JSON serializable

I believe this is a bug.

Maybe this link is helpful: https://www.geeksforgeeks.org/how-to-fix-datetime-datetime-not-json-serializable-in-python/

My system looks like this:

❯ pip list | grep pyexcel
pyexcel             0.7.0
pyexcel-cli         0.0.3
pyexcel-io          0.6.6
pyexcel-ods         0.6.0
pyexcel-xlsx        0.6.0
❯ python --version
Python 3.11.2
❯ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 12 (bookworm)
Release:        12
Codename:       bookworm

Thank you for this wonderful project. Please let me know if I can help somehow!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions