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!
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.
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'}
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.
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
.
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
]
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.
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.
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
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' ] }