簡體   English   中英

在 Python 中使用多行文本自定義文本屬性列表的格式?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM