Есть ли эквивалент 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
Ответ 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 Он имеет свой собственный стиль и кажется полезным тоже.
Ответ 7
Что касается проверки вашего объекта, я нашел этот полезный эквивалент Data: Dumper:
https://salmon-protocol.googlecode.com/svn-history/r24/trunk/salmon-playground/dumper.py
Он может обрабатывать строки unicode.
Ответ 8
Если вы хотите что-то, что работает лучше, чем pprint, но не требует собственного, попробуйте импортировать dumper из pypi:
https://github.com/jric/Dumper.py или https://github.com/ericholscher/pypi/blob/master/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.