我正在尝试在命令行,报表样式上为输出格式化一些字符串,并且正在寻找格式化字符串的最简单方法,以便我可以获得自动段落格式。
perlform格式化是通过“格式”功能
完成的format Something =
Test: @<<<<<<<< @||||| @>>>>>
$str, $%, '$' . int($num)
.
$str = "widget";
$num = $cost/$quantity;
$~ = 'Something';
write;
perlform的变化允许文本包装干净,对于帮助屏幕,日志报告等非常有用。
有等效的python吗?或者我可以使用Python的新字符串format函数编写一个合理的hack?
示例输出我想:
Foobar-Title Blob
0123 This is some long text which would wrap
past the 80 column mark and go onto the
next line number of times blah blah blah.
hi there dito
something more text here. more text here. more text
here.
答案 0 :(得分:5)
没有像Python内置的自动格式化。 (.format
函数语法来自C#。)毕竟,Perl是“实用提取和报告语言”,Python不是为格式化报告而设计的。
您的输出可以使用textwrap
模块完成,例如
from textwrap import fill
def formatItem(left, right):
wrapped = fill(right, width=41, subsequent_indent=' '*15)
return ' {0:<13}{1}'.format(left, wrapped)
...
>>> print(formatItem('0123', 'This is some long text which would wrap past the 80 column mark and go onto the next line number of times blah blah blah.'))
0123 This is some long text which would wrap
past the 80 column mark
and go onto the next line
number of times blah blah
blah.
请注意,这假设“左”不跨越1行。更通用的解决方案是
from textwrap import wrap
from itertools import zip_longest
def twoColumn(left, right, leftWidth=13, rightWidth=41, indent=2, separation=2):
lefts = wrap(left, width=leftWidth)
rights = wrap(right, width=rightWidth)
results = []
for l, r in zip_longest(lefts, rights, fillvalue=''):
results.append('{0:{1}}{2:{5}}{0:{3}}{4}'.format('', indent, l, separation, r, leftWidth))
return "\n".join(results)
>>> print(twoColumn("I'm trying to format some strings for output on the command-line", "report style, and am looking for the easiest method to format a string such that I can get automatic paragraph formatting."))
I'm trying to report style, and am looking for the
format some easiest method to format a string such
strings for that I can get automatic paragraph
output on the formatting.
command-line
答案 1 :(得分:4)
import textwrap
import itertools
def formatter(format_str,widths,*columns):
'''
format_str describes the format of the report.
{row[i]} is replaced by data from the ith element of columns.
widths is expected to be a list of integers.
{width[i]} is replaced by the ith element of the list widths.
All the power of Python's string format spec is available for you to use
in format_str. You can use it to define fill characters, alignment, width, type, etc.
formatter takes an arbitrary number of arguments.
Every argument after format_str and widths should be a list of strings.
Each list contains the data for one column of the report.
formatter returns the report as one big string.
'''
result=[]
for row in zip(*columns):
lines=[textwrap.wrap(elt, width=num) for elt,num in zip(row,widths)]
for line in itertools.izip_longest(*lines,fillvalue=''):
result.append(format_str.format(width=widths,row=line))
return '\n'.join(result)
例如:
widths=[17,41]
form='{row[0]:<{width[0]}} {row[1]:<{width[1]}}'
titles=['Foobar-Title','0123','hi there','something']
blobs=['Blob','This is some long text which would wrap past the 80 column mark and go onto the next line number of times blah blah blah.','dito','more text here. more text here. more text here.']
print(formatter(form,widths,titles,blobs))
产量
# Foobar-Title Blob
# 0123 This is some long text which would wrap
# past the 80 column mark and go onto the
# next line number of times blah blah blah.
# hi there dito
# something more text here. more text here. more text
# here.
formatter
可以使用任意数量的列。
答案 2 :(得分:1)