2014-10-20 12 views
7

Sto cercando di stampare JSON sulla riga di comando, in python, con colori ASCII. Ad esempio, la (eccellente) jq utilità colore ify JSON utilizzando colori ASCII audaci in questo modo:JSON abbastanza in stampa con colore ASCII in pitone

  • ingresso: curl --silent http://coinabul.com/api.php | jq .
  • uscita:
    jq output

Qualcuno sa come portare a termine questo effetto da Python? Un paio di domande su SO forniscono alcune buone informazioni sull'uso dei colori ASCII da Python (ad esempio Print in terminal with colors using Python?), ma questo effetto richiede che la combinazione dei macchinari di stampa carina con i macchinari per la colorazione sia diversa, credo.

risposta

1

Questo dovrebbe iniziare (la stampa chiavi in ​​blu):

import json 
import urllib2 

# ANSI color terminal escape sequences 
OKBLUE = '\033[94m' 
ENDC = '\033[0m' 

def pretty(keyvals, indent=''): 
    print '{' 
    for key, val in keyvals.iteritems(): 
     print '{} {}"{}"{}:'.format(indent, OKBLUE, key, ENDC), 
     if isinstance(val, dict): 
      pretty(val, indent + ' ') 
     elif isinstance(val, str): 
      print '"{}",'.format(val) 
     else: 
      print '{},'.format(val) 
    print indent + '},' 

req = urllib2.Request('http://coinabul.com/api.php', headers={ 
     'User-Agent': 'Mozilla/5.0', 
     }) 

page = urllib2.urlopen(req) 
parsed = json.load(page) 

pretty(parsed) 
+0

sarebbe bello se fosse possibile evitare reinventare tutte le logica di stampa (di indentazione) piuttosto carina. –

+0

Beh, potresti usare 'json.dumps (parsed, indent = 2)' e quindi analizzare il testo che ti dà e colorarlo ... Ho pensato che fosse peggio (più incline agli errori, ecc.). Se quello che stai cercando è una biblioteca che fa tutto questo per te, beh, penso che non esista. –

+0

@ risposta di kerma evita di reinventare le ruote ... –

10

Utilizzare Pygments libreria:

import json 
from pygments import highlight 
from pygments.lexers import JsonLexer 
from pygments.formatters import TerminalFormatter 

json_object = json.loads('{"foo":"bar"}') 
json_str = json.dumps(json_object, indent=4, sort_keys=True) 
print(highlight(json_str, JsonLexer(), TerminalFormatter()))