web-dev-qa-db-fra.com

Existe-t-il un équivalent Python à Data :: Dumper de Perl?

Existe-t-il un module Python utilisable de la même manière que le module Data::Dumper de Perl?

Edit: Désolé, j'aurais dû être plus clair. J'étais principalement après un module d'inspection de données plutôt que de persister.

BTW Merci pour les réponses. C'est un site génial!

35
Rob Wells

Data :: Dumper a deux utilisations principales: la persistance des données et le débogage/inspection d'objets. Autant que je sache, rien ne fonctionnera de la même manière que Data :: Dumper.

J'utilise pickle pour la persistance des données.

J'utilise pprint pour inspecter visuellement mes objets/debug.

28
jjfine

Peut-être quelques alternatives: pickle , marshal , shelve .

4
Juho Vepsäläinen

Je pense que le plus proche que vous trouverez est le module 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'}
4
JimB
  • Pour la sérialisation, il existe de nombreuses options. 

    • L'un des meilleurs est JSON, qui est un standard indépendant de la langue pour la sérialisation. Il est disponible dans le module stdlib json dans la version 2.6 et auparavant avec la même API dans le module simplejson tiers. 

    • Vous ne voulez pas utiliser marshal, qui est assez bas niveau. Si vous vouliez ce qu'il fournit, vous utiliseriez pickle.

    • J'évite d'utiliser pickle, le format est réservé à Python et n'est pas sécurisé. La désérialisation à l'aide de pickle peut exécuter du code arbitraire.

      • Si vous avez utilisé pickle, vous souhaitez utiliser son implémentation C. (Faites import cPickle as pickle.)
  • Pour le débogage, vous voulez généralement examiner la variable repr de l'objet ou utiliser le module pprint.

3
Mike Graham

Voici une solution simple pour vider des données imbriquées composées de dictionnaires, de listes ou de n-uplets (cela fonctionne très bien pour moi):

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)

Voir au travail:

>>> 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
]
3
qed

Moi aussi, j'utilise Data :: Dumper depuis un certain temps et je me suis habitué à sa façon d'afficher des structures de données complexes bien formatées. Comme mentionné ci-dessus, pprint fait un travail assez décent, mais je n’aimais pas vraiment son style de formatage. De plus, pprint ne vous permet pas d'inspecter des objets comme le fait Data :: Dumper:

Recherche sur le net et est tombé sur ces:

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': Aucun 
 '_stream': fichier ::> 
 '_width': 80 
 '_indent_per_level': 4 
 } 

Il est également intéressant de vérifier http://salmon-protocol.googlecode.com/svn-history/r24/trunk/salmon-playground/dumper.py Il a son propre style et semble utile aussi.

2
Saurabh Hirani

En ce qui concerne l'inspection de votre objet, j'ai trouvé ceci un équivalent utile de Data: Dumper:

https://salmon-protocol.googlecode.com/svn-history/r24/trunk/salmon-playground/dumper.py

Il peut gérer des chaînes unicode.

1
Damon

Si vous voulez quelque chose qui fonctionne mieux que pprint, mais ne nécessite pas de rouler vous-même, essayez d’importer un dumper à partir de pypi:
https://github.com/jric/Dumper.py ou https://github.com/ericholscher/pypi/blob/master/dumper.py

1
Joshua Richardson

J'avais besoin de renvoyer un dump de type Perl pour la requête d'API. Je suis donc parvenu à un résultat qui ne formate pas la sortie de manière à être jolie, mais qui me convient parfaitement.

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' ] }
0
Mario Kirov