Есть ли эквивалент Python для Perl Data:: Dumper?

Есть ли модуль Python, который можно использовать так же, как Perl Data::Dumper module?

Изменить: Извините, я должен был быть более ясным. Я был главным образом после модуля для проверки данных, а не сохранения.

Кстати. Спасибо за ответы. Это один потрясающий сайт!

Ответ 1

Данные:: Дампер имеет два основных вида использования: сохранение данных и отладка/проверка объектов. Насколько я знаю, нет ничего, что будет работать точно так же, как Data:: Dumper.

Я использую pickle для сохранения данных.

Я использую pprint для визуального осмотра объектов/отладки.

Ответ 2

Я думаю, что ближе всего вы найдете модуль pprint.

>>> l = [1, 2, 3, 4]
>>> l.append(l)
>>> d = {1: l, 2: 'this is a string'}
>>> print d
{1: [1, 2, 3, 4, [...]], 2: 'this is a string'}

>>> pprint.pprint(d)
{1: [1, 2, 3, 4, <Recursion on list with id=47898714920216>],
 2: 'this is a string'}

Ответ 3

Возможно несколько альтернатив: pickle, marshal, shelve.

Ответ 4

  • Для сериализации существует много вариантов.

    • Один из лучших - JSON, который является языковым агностическим стандартом для сериализации. Он доступен в 2.6 в модуле stdlib json и до этого с тем же API в стороннем модуле simplejson.

    • Вы не хотите использовать marshal, который довольно низкоуровневый. Если вы хотите, что он предоставляет, вы будете использовать pickle.

    • Я избегаю использовать pickle, формат является Python-only и небезопасным. Дессериализация с использованием рассола может выполнять произвольный код.

      • Если вы использовали pickle, вы хотите использовать его реализацию C. (Do import cPickle as pickle.)
  • Для отладки вы обычно хотите посмотреть объект repr или использовать модуль pprint.

Ответ 5

Вот простое решение для дампа вложенных данных, составленных из словарей, списков или кортежей (у меня это работает довольно хорошо):

python2

def printStruct(struc, indent=0):
  if isinstance(struc, dict):
    print '  '*indent+'{'
    for key,val in struc.iteritems():
      if isinstance(val, (dict, list, tuple)):
        print '  '*(indent+1) + str(key) + '=> '
        printStruct(val, indent+2)
      else:
        print '  '*(indent+1) + str(key) + '=> ' + str(val)
    print '  '*indent+'}'
  elif isinstance(struc, list):
    print '  '*indent + '['
    for item in struc:
      printStruct(item, indent+1)
    print '  '*indent + ']'
  elif isinstance(struc, tuple):
    print '  '*indent + '('
    for item in struc:
      printStruct(item, indent+1)
    print '  '*indent + ')'
  else: print '  '*indent + str(struc)

python3

 def printStruct(struc, indent=0):
   if isinstance(struc, dict):
     print ('  '*indent+'{')
     for key,val in struc.items():
       if isinstance(val, (dict, list, tuple)):
         print ('  '*(indent+1) + str(key) + '=> ')
         printStruct(val, indent+2)
       else:
         print ('  '*(indent+1) + str(key) + '=> ' + str(val))
     print ('  '*indent+'}')
   elif isinstance(struc, list):
     print ('  '*indent + '[')
     for item in struc:
       printStruct(item, indent+1)
     print ('  '*indent + ']')
   elif isinstance(struc, tuple):
     print ('  '*indent + '(')
     for item in struc:
       printStruct(item, indent+1)
     print ('  '*indent + ')')
   else: print ('  '*indent + str(struc))

Посмотрите это на работе:

>>> d = [{'a1':1, 'a2':2, 'a3':3}, [1,2,3], [{'b1':1, 'b2':2}, {'c1':1}], 'd1', 'd2', 'd3']
>>> printStruct(d)
[
  {
    a1=> 1
    a3=> 3
    a2=> 2
  }
  [
    1
    2
    3
  ]
  [
    {
      b1=> 1
      b2=> 2
    }
    {
      c1=> 1
    }
  ]
  d1
  d2
  d3
]

Ответ 6

Я тоже долгое время использовал Data:: Dumper и привык к тому, чтобы отображать хорошо отформатированные сложные структуры данных. Как упоминалось выше, pprint делает довольно приличную работу, но мне не очень нравится стиль его форматирования. Этот плюс pprint не позволяет вам проверять объекты, такие как Data:: Dumper:

Искал в сети и наткнулся на них:

https://gist.github.com/1071857#file_dumper.pyamazon

>>> y = { 1: [1,2,3], 2: [{'a':1},{'b':2}]}

>>> pp = pprint.PrettyPrinter(indent = 4)
>>> pp.pprint(y)
{   1: [1, 2, 3], 2: [{   'a': 1}, {   'b': 2}]}

>>> print(Dumper.dump(y)) # Dumper is the python module in the above link
{
    1: [
        1 
        2 
        3
    ] 
    2: [
        {
            'a': 1
        } 
        {
            'b': 2
        }
    ]
}
>>> print(Dumper.dump(pp))
instance::pprint.PrettyPrinter
    __dict__ :: {
        '_depth': None 
        '_stream': file:: > 
        '_width': 80 
        '_indent_per_level': 4
    }

Также стоит проверить http://salmon-protocol.googlecode.com/svn-history/r24/trunk/salmon-playground/dumper.py Он имеет свой собственный стиль и кажется полезным тоже.

Ответ 9

Мне нужно было возвращать Perl-подобный дамп для запроса API, поэтому я пришел к этому, который не форматирует вывод, чтобы быть симпатичным, но делает идеальную работу для меня.

from decimal import Decimal
from datetime import datetime, date

def dump(self, obj):

    if obj is None:
        return "undef"

    if isinstance(obj, dict):
        return self.dump_dict(obj)

    if isinstance(obj, (list, tuple)):
        return self.dump_list(obj)

    if isinstance(obj, Decimal):
        return "'{:.05f}'".format(obj)
        # ... or handle it your way

    if isinstance(obj, (datetime, date)):
        return "'{}'".format(obj.isoformat(
            sep=' ',
            timespec='milliseconds'))
        # ... or handle it your way

    return "'{}'".format(obj)

def dump_dict(self, obj):
    result = []
    for key, val in obj.items():
        result.append(' => '.join((self.dump(key), self.dump(val))))

    return ' '.join(('{', ', '.join(result), '}'))

def dump_list(self, obj):
    result = []
    for val in obj:
        result.append(self.dump(val))

    return ' '.join(('[', ', '.join(result), ']'))



Using the above:

    example_dict = {'a': 'example1', 'b': 'example2', 'c': [1, 2, 3, 'asd'], 'd': [{'g': 'something1', 'e': 'something2'}, {'z': 'something1'}]}

    print(dump(example_dict))

will ouput:

    { 'b' => 'example2', 'a' => 'example1', 'd' => [ { 'g' => 'something1', 'e' => 'something2' }, { 'z' => 'something1' } ], 'c' => [ '1', '2', '3', 'asd' ] }

Ответ 10

Увидел это и понял, что в Python есть что-то похожее на Data :: Dumper в Dumper. Автор описывает это как

Дамп структур данных Python (включая экземпляры классов) в nicely- вложенная, легкая для чтения форма. Правильно обрабатывает рекурсивные структуры данных, и имеет разумные возможности для ограничения масштабов свалки как простая глубина и по некоторым правилам, как обращаться с содержащимися экземплярами.

Установите его через пипс. Репозиторий Github находится в https://github.com/jric/Dumper.py.