Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用多行文本自定义文本属性列表的格式?_Python_Json_Pretty Print_Text Formatting - Fatal编程技术网

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

在Python中使用多行文本自定义文本属性列表的格式?,python,json,pretty-print,text-formatting,Python,Json,Pretty Print,Text Formatting,考虑这个示例,其中我们有一个具有属性的对象,每个属性都包含字符串-一些是单行,另一些是多行: #/usr/bin/env蟒蛇3 导入pprint 类SomeInfo(对象): 定义初始化(自): self.some_param=“某些参数值” self.other_param=“其他参数值” self.quity_longish_param_name=“”Lorem ipsum door sit amet,concertetur adipising elit.Fusce laoreet,odio

考虑这个示例,其中我们有一个具有属性的对象,每个属性都包含字符串-一些是单行,另一些是多行:

#/usr/bin/env蟒蛇3
导入pprint
类SomeInfo(对象):
定义初始化(自):
self.some_param=“某些参数值”
self.other_param=“其他参数值”
self.quity_longish_param_name=“”Lorem ipsum door sit amet,concertetur adipising
elit.Fusce laoreet,odio sed finibus sollicitudin,
第二种情况是暂时性的
马萨,我是康莫多·波苏尔·弗林利亚
some_info=SomeInfo()
格式化的属性列表字符串=pprint.pformat(变量(一些信息))
打印(格式化的属性列表)
这将在终端中打印以下内容:

{'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"
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+'\"')
。。。换句话说:

  • 双引号的引号选择
  • 不使用逗号分隔参数及其值
  • 多行文字只有一组换行引号;它的行是相互对齐的,而不是引号<代码>\n不会显示为行分隔符,并且多行文字不会重新包装
  • 属性的名称以分号右对齐,并且没有用引号括起来
有没有办法说服
pprint
提供这种输出?如果没有,还有没有其他“简单”的选项(不必编写我自己的文本格式化程序)?

你可以使用
eval()
将你的
str
转换为
dict
,然后按照你的格式打印出来,如下所示:

           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"
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+'\"')
输出

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"

好的,这是我的函数,它进行这种打印:

导入pprint
类SomeInfo(对象):
定义初始化(自):
self.some_param=“某些参数值”
self.other_param=“其他参数值”
self.quity_longish_param_name=''Lorem ipsum door sit amet,concertetur adipising
精英。Fusce laoreet,odio sed finibus sollicitudin,
第二种情况是暂时性的
马萨。“我是康莫多·波苏尔·弗林利亚。”
self.testlist=[5,6,7]
some_info=SomeInfo()
类propNameVal(对象):
定义初始化(自身、名称、值):
self.name=名称
自我价值=价值
def get_formatted_prop_list_str(inobj,indent='',spacer='',quotechar='',propnameallign='>',sort=False):
#打印(类型(分类))
如果类型(排序)=列表或类型(排序)=元组:
#打印(“排序为列表/元组”)
propnamelist=排序
elif排序:
#打印(“排序为真”)
propnamelist=已排序(变量(inobj).keys())
其他:
#打印(“排序为假”)
propnamelist=vars(inobj).keys()
#打印(propnamelist)
prop_names_vals=[propNameVal(propname,vars(inobj)[propname]),用于propnamelist中的propname]
#打印(项目名称和价值)
prop_names_len=[prop_names_vals中pnv的len(pnv.name)]
#打印(道具名称)
项目名称=最大值(项目名称)
#打印(道具名称)
propnamefmt='{:'+propnamealign+str(prop_names_maxlen)+'}'{:>2}'
prop_names_fmtd=[prop_names_vals中pnv的propnamefmt.format(pnv.name)]
#打印(项目名称\u fmtd)
out_行=[]
对于ip,枚举中的pnv(属性名称):
vallines=str(pnv.value).splitlines()
如果len(vallines)==1:
out_lines.append({}:{}{}{}{}}.format(属性名称[U fmtd[ip],间隔符,引号,vallines[0],引号))
其他:
对于iln,枚举中的valline(valline):
如果iln==0:
out_lines.append({}:{}{}{}})。格式(prop_names_fmtd[ip],间隔符,引号,valline))
elif iln==len(vallines)-1:
tfmt=propnamefmt+'{}{}{}}{}}}空间,而不是:
out_line.append(tfmt.format(“,间隔符,”,valline,quotechar))
其他:
tfmt=propnamefmt+'{}{}{}'#空间,而不是:
out_lines.append(tfmt.format(“,spacer,”,valline))
返回“\n”。加入(输出行)
格式化的属性列表=获取格式化的属性列表(一些信息,排序=(“另一个参数”,“相当长的参数名”,“一些参数”,“测试列表”))
打印(格式化的属性列表)
输出:

$ 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]"

不,但是自己编写格式化代码看起来相当容易。试试看,应该不难。谢谢@smci——那就是我要做的,干杯!谢谢@Zeek——大部分情况下看起来不错——除了将多行文本行相互对齐,并将参数名正确对齐为分号。我一直在尝试将其对齐过去一个小时。似乎找不到在终端中执行此操作的方法。问题是,我应用的任何对齐操作都会影响所有三行,导致格式怪异的字符串。如果找到方法,将编辑答案。