如何在Python中使用pprint缩进?

9

我正在尝试使用pprint缩进输出,以便获得一个带有8个空格缩进的输出。我使用的代码是:

import numpy as np
from pprint import pprint
A = np.array([1, 2, 3, 4])
f = open("log.txt", 'w')
n = 2
for i in range(n):
    A = A + 1
    f.writelines(list(u'    \u27B3 - %s\n'.encode('utf-8') % i for i in A))
    pprint(globals())

输出

{'A': array([2, 3, 4, 5]),
 '__builtins__': <module '__builtin__' (built-in)>,
 '__doc__': None,
 '__file__': '~/Stack exchange/pprint_tab.py',
 '__name__': '__main__',
 '__package__': None,
 'f': <open file 'log.txt', mode 'w' at 0xb659b8b8>,
 'i': 0,
 'n': 2,
 'np': <module 'numpy' from '/usr/lib/python2.7/dist...,
 'pprint': <function pprint at 0xb6dea48c>}
{'A': array([3, 4, 5, 6]),
 '__builtins__': <module '__builtin__' (built-in)>,
 '__doc__': None,
 '__file__': '~/Stack exchange/pprint_tab.py',
 '__name__': '__main__',
 '__package__': None,
 'f': <open file 'log.txt', mode 'w' at 0xb659b8b8>,
 'i': 1,
 'n': 2,
 'np': <module 'numpy' from '/usr/lib/python2.7/dist...,
 'pprint': <function pprint at 0xb6dea48c>}

期望输出

        {'A': array([2, 3, 4, 5]),
         '__builtins__': <module '__builtin__' (built-in)>,
         '__doc__': None,
         '__file__': '~/Stack exchange/pprint_tab.py',
         '__name__': '__main__',
         '__package__': None,
         'f': <open file 'log.txt', mode 'w' at 0xb659b8b8>,
         'i': 0,
         'n': 2,
         'np': <module 'numpy' from '/usr/lib/python2.7/dist...,
         'pprint': <function pprint at 0xb6dea48c>}
        {'A': array([3, 4, 5, 6]),
         '__builtins__': <module '__builtin__' (built-in)>,
         '__doc__': None,
         '__file__': '~/Stack exchange/pprint_tab.py',
         '__name__': '__main__',
         '__package__': None,
         'f': <open file 'log.txt', mode 'w' at 0xb659b8b8>,
         'i': 1,
         'n': 2,
         'np': <module 'numpy' from '/usr/lib/python2.7/dist...,
         'pprint': <function pprint at 0xb6dea48c>}

简而言之,我需要在写入文件或使用pprint打印时进行空格缩进。我尝试过
pp = pprint.PrettyPrinter(indent=8)

但是它不起作用。

3个回答

14

不能使pprint()添加额外的前导空格。

你最好使用pprint.pformat()函数,然后手动添加缩进:

from pprint import pformat

print ''.join([
    '        ' + l
    for l in pformat(globals()).splitlines(True)])

使用str.splitlines()方法将pformat()的输出按行分隔以便于重新拼接。

在Python 3中,可以使用textwrap.indent()来进行缩进:

from pprint import pformat
from textwrap import indent

print(indent(pformat(globals()),
             '        '))

3

我可能会因为没有直接回答OP的要求而受到批评,但我建议你在这里使用json而不是pprint:

   d = {'dog':7,'cat':{'feet':12,'head':7}}
   print(json.dumps(d), indent=2)

产出
{
   "dog": 7,
   "cat": {
      "feet": 12,
      "head": 7
   }
}

感谢 Mahmoud Essam 的提醒。

0
Martijn的答案有一个小更新。在简单的字符串连接中不需要使用.format()。
from pprint import pformat

def left_indent(text, indent=' ' * 8):
    return ''.join([indent + l for l in text.splitlines(True)])

print(indent(pformat(data)))

1
你正在使用生成器表达式,而不是元组,在 str.join() 中会导致性能瓶颈。请参考 https://dev59.com/AWox5IYBdhLWcg3wpV_F#9061024。 - Martijn Pieters
更新。 - Gringo Suave
1
你说得对,我也不确定当时为什么要使用format;我想这可能是因为之前使用.splitlines()时没有加上True(而format又会添加回换行符)。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接