[英]Customizing the formatting of a textual property list, with multi-line text, in Python?
考虑这个例子,我们有一个带有属性的 object,每个属性都包含字符串——一些是单行的,另一些是多行的:
#!/usr/bin/env python3
import pprint
class SomeInfo(object):
def __init__(self):
self.some_param = "Some parameter value"
self.another_param = "Another parameter value"
self.quite_longish_param_name = """Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Fusce laoreet, odio sed finibus sollicitudin,
ipsum nibh vulputate ex, quis tempor lorem enim sed
massa. Duis commodo posuere fringilla."""
some_info = SomeInfo()
formatted_prop_list_str = pprint.pformat(vars(some_info))
print(formatted_prop_list_str)
这将在终端中打印以下内容:
{'another_param': 'Another parameter value',
'quite_longish_param_name': 'Lorem ipsum dolor sit amet, consectetur '
'adipiscing\n'
'elit. Fusce laoreet, odio sed finibus '
'sollicitudin,\n'
'ipsum nibh vulputate ex, quis tempor lorem enim '
'sed\n'
'massa. Duis commodo posuere fringilla.',
'some_param': 'Some parameter value'}
...这接近我想要的,但不完全是。 我真正想要的是这样的:
another_param: "Another parameter value"
quite_longish_param_name: "Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Fusce laoreet, odio sed finibus sollicitudin,
ipsum nibh vulputate ex, quis tempor lorem enim sed
massa. Duis commodo posuere fringilla."
some_param: "Some parameter value"
...或者换句话说:
\n
不显示为行分隔符,多行文本不重新换行 有没有办法说服pprint
提供这种 output - 如果没有,是否还有其他“简单”选项(无需编写我自己的文本格式化程序)?
您可以使用eval()
将您的str
转换为dict
,然后根据您的格式打印它,如下所示:
import pprint
class SomeInfo(object):
def __init__(self):
self.some_param = "Some parameter value"
self.another_param = "Another parameter value"
self.quite_longish_param_name = """Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Fusce laoreet, odio sed finibus sollicitudin,
ipsum nibh vulputate ex, quis tempor lorem enim sed
massa. Duis commodo posuere fringilla."""
some_info = SomeInfo()
formatted_prop_list_str = pprint.pformat(vars(some_info))
# print(type(formatted_prop_list_str))
x=eval(formatted_prop_list_str)
for k,v in x.items():
print(k+': '+'\"'+v+'\"')
OUTPUT :
another_param: "Another parameter value"
quite_longish_param_name: "Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Fusce laoreet, odio sed finibus sollicitudin,
ipsum nibh vulputate ex, quis tempor lorem enim sed
massa. Duis commodo posuere fringilla."
some_param: "Some parameter value"
好的,这是我的 function 进行这种打印:
import pprint
class SomeInfo(object):
def __init__(self):
self.some_param = "Some parameter value"
self.another_param = "Another parameter value"
self.quite_longish_param_name = '''Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Fusce laoreet, odio sed finibus sollicitudin,
ipsum nibh vulputate ex, quis tempor lorem enim sed
massa. Duis commodo posuere fringilla.'''
self.testlist = [5, 6, 7]
some_info = SomeInfo()
class propNameVal(object):
def __init__(self, name, value):
self.name = name
self.value = value
def get_formatted_prop_list_str(inobj, indent=' ', spacer=' ', quotechar='"', propnamealign='>', sort=False):
#print(type(sort))
if type(sort)==list or type(sort)==tuple:
#print("sort is list/tuple")
propnamelist = sort
elif sort:
#print("sort is True")
propnamelist = sorted( vars(inobj).keys() )
else:
#print("sort is False")
propnamelist = vars(inobj).keys()
#print(propnamelist)
prop_names_vals = [ propNameVal(propname, vars(inobj)[propname]) for propname in propnamelist ]
#print(prop_names_vals)
prop_names_len = [ len(pnv.name) for pnv in prop_names_vals ]
#print(prop_names_len)
prop_names_maxlen = max(prop_names_len)
#print(prop_names_maxlen)
propnamefmt = '{:'+ propnamealign + str(prop_names_maxlen) + '}' #'{:>2}'
prop_names_fmtd = [ propnamefmt.format(pnv.name) for pnv in prop_names_vals ]
#print(prop_names_fmtd)
out_lines = []
for ip, pnv in enumerate(prop_names_vals):
vallines = str(pnv.value).splitlines()
if len(vallines) == 1:
out_lines.append( '{}:{}{}{}{}'.format(prop_names_fmtd[ip], spacer, quotechar, vallines[0], quotechar) )
else:
for iln, valline in enumerate( vallines ):
if iln==0:
out_lines.append( '{}:{}{}{}'.format(prop_names_fmtd[ip], spacer, quotechar, valline) )
elif iln==len(vallines)-1:
tfmt = propnamefmt+' {}{}{}{}' # space instead of :
out_lines.append( tfmt.format("", spacer, " ", valline, quotechar) )
else:
tfmt = propnamefmt+' {}{}{}' # space instead of :
out_lines.append( tfmt.format("", spacer, " ", valline) )
return "\n".join(out_lines)
formatted_prop_list_str = get_formatted_prop_list_str(some_info, sort=('another_param', 'quite_longish_param_name', 'some_param', 'testlist'))
print(formatted_prop_list_str)
Output:
$ python3 /tmp/test.py
another_param: "Another parameter value"
quite_longish_param_name: "Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Fusce laoreet, odio sed finibus sollicitudin,
ipsum nibh vulputate ex, quis tempor lorem enim sed
massa. Duis commodo posuere fringilla."
some_param: "Some parameter value"
testlist: "[5, 6, 7]"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.