Joli imprimé json ou yaml avec couleur en python

Aperçu

Depuis la ligne de commande, joliment imprimer json ou yaml en couleur.

Vous pouvez également afficher certains des objets python (objets qui ont basestring, int, long, float, dict, list et \ _ \ _dict \ _ \ _) en couleur.

Depuis la ligne de commande

# json
$ echo '{ "name": "pp.py", "list": [ 1, 2, 3, "Da!" ] }' | pp.py

#yaml
$ echo '{ name: pp.py, list: [ 1, 2, 3, Da! ] }' | pp.py

pp_cmdline.png

En tant que module

>>> import pp
>>> pp.pprint({ "name": "pp.py", "list": [ 1, 2, 3, "Da!" ] })
{
  list: [ 1, 2, 3, "Da!", ],
  name: "pp.py",
}

pp_module.png

Pprintf pour la journalisation

>>> import pp
>>> import logging
>>> logging.basicConfig()
>>> logging.warning( pp.pprintf( object ) )

pp_logging.png

La source

pp.py


#!/bin/env python
# -*- coding: utf-8 -*-

class color:
    BLUE = '\033[1;34m'
    BLUEL = '\033[0;34m'
    GREEN = '\033[1;32m'
    GREENL = '\033[0;32m'
    CYAN = '\033[1;36m'
    CYANL = '\033[0;36m'
    RED = '\033[1;31m'
    REDL = '\033[0;31m'
    PURPLE = '\033[1;35m'
    PURPLEL = '\033[0;35m'
    YELLOW = '\033[1;33m'
    BROWN = '\033[0;33m'
    WHITE = '\033[1;37m'
    GRAYL = '\033[0;37m'
    GRAYD = '\033[1;30m'
    BLACK = '\033[0;30m'
    ENDC = '\033[0m'

def pretty_convert(obj):
    if isinstance(obj, (float)):
        return u'{1}{2}{0}'.format(color.ENDC, color.PURPLEL, obj)
    elif isinstance(obj, ( bool )):
        return u'{1}{2}{0}'.format(color.ENDC, color.CYAN, obj)
    elif isinstance(obj, ( int, long, complex )):
        return u'{1}{2}{0}'.format(color.ENDC, color.BLUE, obj)
    elif isinstance(obj, ( unicode )):
        return u'{1}"{0}{2}{3}{0}{1}"{0}'.format(color.ENDC, color.REDL, color.RED, obj)
    elif isinstance(obj, ( str )):
        return u'{1}"{0}{2}{3}{0}{1}"{0}'.format(color.ENDC, color.REDL, color.RED, unicode(obj,'utf-8'))
    elif isinstance(obj, ( dict )):
        return dict((u'{1}{2}:{0}'.format(color.ENDC, color.YELLOW,k), pretty_convert(v)) for k, v in obj.items())
    elif isinstance(obj, (list, tuple)):
        return map(pretty_convert, obj)
    elif isinstance(obj, type(None)):
        return 'None'
    elif hasattr(obj, '__dict__') :
        return dict((u'{1}{2}:{0}'.format(color.ENDC, color.YELLOW,k), pretty_convert(v)) for k, v in obj.__dict__.items())
    else:
        return '<pp: cannot decode>'

def walk_obj(buf, obj, indent_num=2, depth=0, eol='', wrap_len=60, wrap_total=100, lf='\n'):
    indent = ' '*indent_num*depth
    buf.write(u'{0}'.format(eol if not eol else eol+indent) )
    if isinstance(obj, (basestring, int, float, complex)):
        buf.write(u'{0}'.format(obj).replace(lf, '{0}{1} '.format(lf, indent)) )
    elif isinstance(obj, ( dict )):
        if not obj:
            buf.write('{}')
            return
        eol, eol_org = lf, eol
        buf.write('{ ')
        for key in sorted(obj.keys()):
            buf.write(u'{0}{1}{2}{3} '.format(eol, indent, ' '*indent_num, key))
            walk_obj(buf=buf, obj=obj[key], indent_num=indent_num, depth=depth+1, eol='', wrap_len=wrap_len, lf=lf )
            buf.write(',')
        buf.write('{0}}}'.format(eol if not eol else eol+indent) )
        eol=eol_org
    elif isinstance(obj, (list, tuple)):
        if not obj:
            buf.write('[]')
            return
        eol_org, indent_org = eol, indent
        for item in obj:
            if isinstance(item, (list, dict)):
                eol = lf
                break
            else:
                eol = ''
                indent = ''
                continue
        if max(map(len,obj if obj else " " )) > wrap_len or sum(map(len,obj)) > wrap_total:
            eol = lf
        buf.write('[ ')
        for item in obj:
            walk_obj(buf=buf, obj=item, indent_num=indent_num, depth=depth+1, eol=eol, wrap_len=wrap_len, lf=lf )
            buf.write(', ')
        buf.write('{0}]'.format(eol if not eol else eol+indent_org) )
        eol, indent = eol_org, indent_org

def pprint(obj, indent=2, b=None, lf='\n'):
    if not b:
        import sys, codecs
        b = codecs.getwriter('utf_8')(sys.stdout)
    walk_obj(b, pretty_convert(obj), indent_num=indent)
    b.write(lf)

def pprintf(obj, indent=2):
    from StringIO import StringIO
    buf=StringIO()
    walk_obj(buf, pretty_convert(obj), indent_num=indent)
    return buf.getvalue()


if __name__ == '__main__':
  import sys
  import codecs
  import json

  if len(sys.argv) < 2:
     raw_data = codecs.getreader('utf_8')(sys.stdin).read()
  else:
     raw_data = codecs.open(sys.argv[1], 'r', 'utf_8').read()

  indent = 2 if len(sys.argv) <3 else int(sys.argv[2])

  parsed_data = None
  try:
      parsed_data = json.loads(raw_data)
  except ValueError as e1:
      #print e1
      try:
          import yaml
          parsed_data = yaml.load(raw_data)
      except yaml.scanner.ScannerError as e2:
          #print e2
          pass
  if not parsed_data:
      sys.exit(2)

  pprint(parsed_data, indent)
  b = codecs.getwriter('utf_8')(sys.stdout)

https://github.com/aminamid/pp

Recommended Posts

Joli imprimé json ou yaml avec couleur en python
Sortir les caractères de couleur en joli avec python
Manipuler yaml avec python
[Python] Utiliser JSON avec Python
Manipulation de json en python
Pensez à yaml avec python
Journal de sortie au format JSON avec journalisation standard Python
Conversion mutuelle entre JSON et YAML / TOML en Python
Entrez en contact avec la programmation fonctionnelle en JavaScript ou Python 3
Compléter automatiquement le contenu YAML avec Python
Formatez facilement JSON avec Python
Grattage au sélénium en Python
Exploitez LibreOffice avec Python
POST json avec le script Python 3
Débogage avec pdb en Python
Gérer les sons en Python
Grattage avec Tor en Python
Tweet avec image en Python
Combiné avec ordinal en Python
Formater json avec Vim (avec python)
Lire des données json avec python
Reconnaissance des nombres dans les images avec Python
Comment ne pas échapper au japonais en traitant avec JSON en Python
Tester avec des nombres aléatoires en Python
GOTO en Python avec Sublime Text 3
Ecrire un schéma JSON avec Python DSL
Travailler avec LibreOffice en Python: import
Scraping avec Selenium en Python (Basic)
Analyse CSS avec cssutils en Python
Exécutez mruby avec Python ou Blender
Numer0n avec des objets fabriqués avec Python
Charger dynamiquement les types json avec python
Gestion des fichiers JSON en Python
Encodage et décodage JSON avec python
Utiliser rospy avec virtualenv dans Python3
Utiliser Python mis en pyenv avec NeoVim
[Python3] Enregistrez la matrice de moyenne et de covariance dans json avec les pandas
Heatmap avec dendrogramme en Python + matplotlib
Lire des fichiers en parallèle avec Python
Générer un mot de passe pour le manuel avec python
Utiliser OpenCV avec Python 3 dans Window
Jusqu'à traiter de python dans Atom
Démarrez avec Python avec Blender
Travailler avec des images DICOM en Python
[Python] Spécifiez les attributs à changement dynamique dans Selenium avec XPATH (ou sélecteur CSS)
Écrire de la documentation dans Sphinx avec Python Livereload
Obtenez des données supplémentaires vers LDAP avec python
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
Essayez de reproduire un film couleur avec Python
Utiliser l'impression dans l'expression lambda Python2
Essayez de vous connecter à qiita avec Python
Test de stress avec Locust écrit en Python
Python3> dans le mot clé> Vrai avec une correspondance partielle?
Contrôle exclusif avec fichier de verrouillage en Python
Surveillance des appareils effectuée par Python On-box de IOS-XE
Essayez de travailler avec des données binaires en Python
Rendement Python express en JavaScript ou Java
Dessinez Nozomi Sasaki dans Excel avec python
Prenez la somme logique de List en Python (fonction zip)
Conseils pour gérer les binaires en Python
Afficher Python 3 dans le navigateur avec MAMP