2010-03-29 12 views

Respuesta

26

Datos :: Dumper tiene dos usos principales: persistencia de datos y depuración/inspección de objetos. Hasta donde yo sé, no hay nada que funcione exactamente igual que Data :: Dumper.

Uso pickle para la persistencia de los datos.

Uso pprint para inspeccionar visualmente mis objetos/depurar.

+3

Además, un simple " print "en Python hace en parte lo que Data :: Dumper hace por Perl. – EOL

3

Posiblemente un par de alternativas: pickle, marshal, shelve.

+0

'mariscal' es casi seguro que no es lo que alguien quiere. –

+0

Usar una combinación como esta es útil (por supuesto, debe saber que el elemento es un elemento del objeto): 'pprint (objeto) pprint (vars (objeto)) pprint (vars (object.element))' – gaoithe

4

Creo que lo más cerca que encontrará es el módulo 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
  • para la serialización, hay muchas opciones.

    • Uno de los mejores es JSON, que es un estándar de serialización independiente del idioma. Está disponible en 2.6 en el módulo stdlib json y antes de eso con la misma API en el módulo simplejson de terceros.

    • No desea utilizar marshal, que es bastante bajo nivel. Si quería lo que ofrece, usaría pickle.

    • Evito utilizar pickle, el formato es solo de Python e inseguro. La deserialización usando pickle puede ejecutar código arbitrario.

      • Si usó pickle, desea utilizar la implementación C de la misma. (Haga import cPickle as pickle.)
  • Para la depuración, normalmente se quiere mirar el objeto de repr o utilizar el módulo pprint.

2

Yo también he estado usando Data :: Dumper por bastante tiempo y me he acostumbrado a su forma de mostrar estructuras de datos complejas con un buen formato. pprint como se mencionó anteriormente hace un trabajo bastante decente, pero no me gustó su estilo de formateo.Eso, más pprint no le permite inspeccionar objetos como datos :: Dumper hace:

buscado en la red y encontré con estos:

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 
    } 

También vale la pena mirar es http://salmon-protocol.googlecode.com/svn-history/r24/trunk/salmon-playground/dumper.py Tiene su propio estilo y parece útil también.

3

Aquí es una solución sencilla para volcar los datos anidados compuestos de diccionarios, listas de tareas, o tuplas (que funciona bastante bien para mí):

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) 

Ver en el trabajo:

>>> 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 
] 
+0

¡Perfecto! Solo corté y pegué esto en Dumper.py y luego importé Dumper; imprimir (Dumper.printStruct (dict_or_list)); #works, aunque cambio el printStruct al volcado. –

Cuestiones relacionadas