Eu gosto do módulo pprint em Python. Eu o uso muito para teste e depuração. Eu freqüentemente uso a opção de largura para garantir que a saída se encaixe perfeitamente na janela do meu terminal.
Funcionou bem até que adicionaram o novo tipo de dicionário ordenado no Python 2.7 (outro recurso legal de que gosto muito). Se tento imprimir um dicionário ordenado de maneira bonita, ele não fica bem. Em vez de ter cada par de valores-chave em sua própria linha, a coisa toda aparece em uma longa linha, que envolve muitas vezes e é difícil de ler.
Alguém aqui tem uma maneira de fazê-lo imprimir bem, como os antigos dicionários não ordenados? Provavelmente poderia descobrir algo, possivelmente usando o método PrettyPrinter.format, se eu gastar tempo suficiente, mas estou me perguntando se alguém aqui já conhece uma solução.
ATUALIZAÇÃO: enviei um relatório de bug para isso. Você pode vê-lo em http://bugs.python.org/issue10592 .
fonte
Respostas:
Como uma solução temporária, você pode tentar despejar no formato JSON. Você perde algumas informações de tipo, mas parece bom e mantém a ordem.
fonte
pprint.pprint(dict(data))
?pprint.pprint(dict(data))
funciona bem se você não se importar com a ordem das chaves. Pessoalmente, gostaria que o__repr__
forOrderedDict
produzisse uma saída como essa, mas preservasse a ordem das chaves.O seguinte funcionará se a ordem de seu OrderedDict for uma classificação alfa, uma vez que pprint classificará um dicionário antes da impressão.
fonte
dict
deve evitar o problema de colocar tudo em uma linha.Aqui está outra resposta que funciona substituindo e usando a
pprint()
função de estoque internamente. Ao contrário do meu mais adiantado que irá lidarOrderedDict
é dentro de outro recipiente, como umlist
e também deve ser capaz de lidar com quaisquer argumentos de palavra-chave opcionais dadas - no entanto, não têm o mesmo grau de controle sobre a saída que o outro oferecidas.Ele opera redirecionando a saída da função de estoque para um buffer temporário e, em seguida, quebra a palavra antes de enviá-la para o fluxo de saída. Embora a saída final produzida não seja excepcionalmente bonita, é decente e pode ser "boa o suficiente" para ser usada como uma solução alternativa.
Atualização 2.0
Simplificado usando o
textwrap
módulo de biblioteca padrão e modificado para funcionar em Python 2 e 3.Saída de amostra:
»
{'john': 1, 'mary': 3, 'paul': 2}
»
OrderedDict([('john', 1), ('paul', 2),
('mary', 3)])
»
[OrderedDict([('john', 1), ('paul', 2),
('mary', 3)]), OrderedDict([('moe', 1),
('curly', 2), ('larry', 3)]),
OrderedDict([('weapons', 1), ('mass',
2), ('destruction', 3)])]
fonte
Para imprimir um dicionário ordenado, por exemplo
eu faço
Que rende
ou
que produz
fonte
Esta é uma maneira que hackeia a implementação de
pprint
.pprint
classifica as chaves antes de imprimir, portanto, para preservar a ordem, só precisamos fazer com que as chaves sejam classificadas da maneira que desejamos.Observe que isso afeta a
items()
função. Portanto, você pode querer preservar e restaurar as funções substituídas após fazer o pprint.fonte
Aqui está minha abordagem para imprimir um OrderedDict
Se você quiser imprimir o dicionário com as chaves em ordem classificada
fonte
python3
. VerifiqueIsso é muito rudimentar, mas eu só precisava de uma maneira de visualizar uma estrutura de dados composta de quaisquer Mapeamentos e Iterables arbitrários e foi isso que pensei antes de desistir. É recursivo, por isso vai passar por estruturas e listas aninhadas muito bem. Usei as classes de base abstratas Mapping e Iterable de coleções para lidar com quase tudo.
Eu queria uma saída quase yaml com código python conciso, mas não consegui.
e alguns dados de teste usando OrderedDict e listas de OrderedDicts ... (sheesh Python precisa de literais OrderedDict muuuito mal ...)
produz a seguinte saída:
Pensei em usar str.format () para um melhor alinhamento, mas não tive vontade de aprofundar. Você precisaria especificar dinamicamente as larguras do campo, dependendo do tipo de alinhamento que deseja, o que seria complicado ou complicado.
De qualquer forma, isso me mostra meus dados de forma hierárquica legível, então isso funciona para mim!
fonte
Lá vai você ^^
ou
fonte
pprint_od()
função não funciona - afor key, item in od
instrução resulta em aValueError: too many values to unpack
e a única saída indentada é a final" }"
e akey, item
naprint
instrução precisa estar entre parênteses. Aí está ^^Eu testei esse hack profano baseado em patch de macaco no python3.5 e ele funciona:
Você pode
pprint
usar o resumo baseado em dict usual e também desabilitar a classificação durante a chamada para que nenhuma chave seja realmente classificada para impressão.fonte
pretty_print.py
como um módulo local e hackear (removendo asorted
chamada ou o que quiser).A partir do Python 3.8:
pprint.PrettyPrinter
expõe osort_dicts
parâmetro de palavra - chave.Verdadeiro por padrão, defini-lo como Falso deixará o dicionário sem classificação.
Irá produzir:
Referência: https://docs.python.org/3/library/pprint.html
fonte
O
pprint()
método é apenas invocar o__repr__()
método das coisas nele, eOrderedDict
não parece fazer muito em seu método (ou não tem um ou algo assim).Aqui está uma solução barata que deve funcionar SE VOCÊ NÃO SE PREOCUPAR COM O PEDIDO ESTÁ VISÍVEL NA SAÍDA DE IMPRESSÃO , que pode ser grande se:
Estou realmente surpreso que a ordem não seja preservada ... ah, bem.
fonte
Você também pode usar esta simplificação da resposta kzh :
Ele preserva a ordem e produzirá quase o mesmo que a resposta do webwurst ( imprimir por meio do json dump ).
fonte
Para python <3.8 (por exemplo, 3.6):
Remendo macaco
pprint
'ssorted
, a fim de impedi-lo de triagem. Isso terá o benefício de tudo funcionar recursivamente também, e é mais adequado do que ajson
opção para quem precisa usar, por exemplo, owidth
parâmetro:Editar: limpeza
Para limpar esse negócio sujo, basta executar:
pprint.sorted = sorted
Para uma solução realmente limpa pode até usar um gerenciador de contexto:
fonte
Você pode redefinir
pprint()
e interceptar chamadas paraOrderedDict
's. Aqui está uma ilustração simples. Como escrito, oOrderedDict
código override ignora quaisquer opcionaisstream
,indent
,width
, oudepth
palavras-chave que podem ter sido passados, mas poderia ser melhorado para implementá-las. Infelizmente, essa técnica não os manipula dentro de outro contêiner, como umlist
deOrderDict
'sfonte
Se os itens do dicionário forem todos de um tipo, você pode usar a incrível biblioteca de manipulação de dados
pandas
:ou
fonte