Эквивалент Python для функции R dput()

Есть ли какая-либо функция в python, похожая на функция dput() в R?

Ответ 1

Существует несколько вариантов сериализации объектов Python в файлы:

  • json.dump() сохраняет данные в формате JSON. Он очень read- и доступен для редактирования, но может хранить только списки, тексты, строки, числа, логические значения, поэтому нет составных объектов. Прежде чем сделать модуль json доступным, необходимо import json.
  • pickle.dump() может хранить большинство объектов.

Менее распространенный:

  • Модуль shelve хранит несколько объектов Python в базе данных DBM, в основном действуя как постоянный dict.
  • marshal.dump(): Не уверен, когда тебе это понадобится.

Ответ 2

для pandas.DataFrame, print(df.to_dict()), как показано здесь here

Ответ 3

Этот ответ сфокусирован на json.dump() и json.dumps() и на том, как их использовать с массивами. Если вы попытаетесь, Python выдаст вам сообщение об ошибке, в котором говорится, что ndarrays не поддерживает сериализацию в формате JSON:

import numpy as np
import json

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
json.dumps(a)
TypeError: Object of type 'ndarray' is not JSON serializable

Вы можете избежать этого, сначала переведя его в список. Ниже приведены два рабочих примера:

json.dumps()

json.dumps() кажется наиболее близким к R dput(), поскольку позволяет копировать и вставлять результат прямо из консоли:

json.dumps(a.tolist()) # '[[1, 2, 3], [4, 5, 6], [7, 8, 9]]'

json.dump()

json.dump() отличается от dput(), но все равно очень полезен. json.dump() закодирует ваш объект в файл json.

# Encode:
savehere = open('file_location.json', 'w')
json.dump(a.tolist(), savehere)

который вы можете затем декодировать в другом месте:

# Decode:
b = open('file_location.json', 'r').read()   # b is '[[1, 2, 3], [4, 5, 6], [7, 8, 9]]'
c = json.loads(b)

Затем вы можете снова преобразовать его обратно в массив:

c = np.array(c)

Дополнительная информация

о том, как избежать ошибки "not serializable", смотрите:

Ответ 4

IMO, json.dumps() (обратите внимание на s) еще лучше, так как он возвращает строку, а не json.dump(), которая требует от вас записи в файл.