[英]Python formatting of strings with line breaks
我正在嘗試很好地格式化數據庫中的一些文本數據,以便在Django中發送電子郵件。 我遇到帶換行符的字符串問題。
特別是,我想要的輸出是:
1) t1 t2
t1_continue t2_end
t1_end
2) s1 s3
s1_continue
s1_end
這里從數據庫獲取的字符串是“ t1 \\ nt1_continue \\ nt1_end”,“ t2 \\ nt2_end”,“ s1 \\ ns1_continue \\ ns1_end”和“ s3”。
這個期望的輸出就像我們在Excel中有3列時看到的那樣。
我想說的是,有些字符串包含換行符,所以格式很簡單,例如:
print str(index) + '\t' + col1 + '\t' + col2
將無法正常工作。
請與我分享您的方法。
非常感謝。
\\t
的顯示方式因操作系統,應用程序等而異。 對於真正的字符串格式,我建議您檢查docs 。 例如,
print('{0}) {1:<25} {2}'.format(index,col1,col2))
假設col1
不能大於24個字符,將執行您想要的操作。 如果是這樣,您可以隨時根據自己的喜好調整該值。
您可以使用<table>
在電子郵件正文中顯示表格數據。
在print
每個表行的循環之前,請print
表頭:
print('<table>')
對於每個數據行,將其格式化為:
print('<tr><td>{0}</td><td>{1}</td><td>{2}</td></tr>'.format(index, col1, col2))
最后,在print
每個表格行的循環之后, print
表格頁腳:
print('</table>')
我以為我可以在幾分鍾之內將某些東西混在一起,但是將文本格式化為列比我想象的要困難得多。 然而,這是我到目前為止所得到的,仍然是越野車...
class format_lines(object):
"""
1) some text goes 2nd column of text
here. But not its not really that
all text goes hard to add more text
in this column in a given format
2) another point
for text
"""
def __init__(self, *args, **kargs):
self.max_char_width = 30
self.gutter_width = 15
self.gutter = ' '*self.gutter_width
self.previous_line1 = None
self.previous_line2 = None
self.p1_index = 0
self.p2_index = 0
print args
print "len args = ", len(args)
if len(args) == 2:
print "Starting the test"
self.print_lines_(args[0], args[1])
def print_lines_(self, p1, p2):
while self.p1_index < len(p1.split()):
this = self.format_line_(p1, p2)
p1=this['p1']
p2=this['p2']
print this['line']
#problem with this format is it's going to messup words by
#pushing them to the next line (this could be fixed with a -
#or this function could be rewritten
def format_line_(self, p1, p2):
#must first figure out amount of words that can fit on a line
p1_words = [""]
p2_words = [""]
if p1:
p1_words = p1.split(' ')
p1_words = p1_words[self.p1_index:]
if p2:
p2_words = p2.split(' ')
p2_words = p2_words[self.p2_index:]
#format left side's output
loutput = p1_words[0]
if len(loutput) < self.max_char_width:
for i, word in enumerate(p1_words[1:]):
if (len(loutput) + len(word)) <= self.max_char_width:
loutput += (' {0}'.format(word))
self.p1_index = i
else:
break
self.p1_index+=1 #for loop iteration starts at index 1 not 0 so
#a +1 is required
elif (len(loutput) > self.max_char_width):
long_word = []
long_word.append(loutput[:len(loutput)/2])
long_word.append(loutput[len(loutput)/2:])
long_word[0]+='-'
p1_words[0]=long_word[0]
p1_words.insert(1, long_word[1])
p1 = ' '.join(p1_words)
else:
#the left output is a single word
#equal to the max_char_width
pass
#need to add 1 to the index, because at least 1 element in the list is
#going to be printed
self.p1_index+=1
#format right side's output
routput = p2_words[0]
if len(routput) < self.max_char_width:
for word in p2_words[1:]:
if (len(routput) + len(word)) <= self.max_char_width:
routput += (' {0}'.format(word))
else:
break
self.p2_index+=1
elif len(routput) > self.max_char_width:
long_word = []
long_word.append(routput[:len(routput)/2])
long_word.append(routput[len(routput)/2:])
long_word[0]+='-'
p2_words[0]=long_word[0]
p2_words.insert(1, long_word[1])
p2 = ' '.join(p2_words)
else:
#the right output is a single word
#equal to the max_char_width
pass
self.p2_index+=1
#determin gutter size
if len(loutput) < self.max_char_width:
loutput+=(' '*(self.max_char_width-len(loutput)))
#do not need to append spaces to the right hand size
output = ''
#if previous_line1 is not defined then there should be no way that previous_line2 is defined
if not self.previous_line1:
#must be the first line of a bullet point
output = '1){0}{1}{2}{3}'.format(self.gutter,
loutput,
self.gutter,
routput)
self.previous_line1 = loutput
self.previous_line2 = routput
else:
p1_width = len(self.previous_line1)
p2_width = len(self.previous_line2)
if loutput<p1_width:
loutput+=(' '*(len(self.previous_line1)-p1_width))
if routput<p2_width:
routput+=(' '*(len(self.previous_line2)-p2_width))
output = ' {0}{1}{2}{3}'.format(self.gutter,
loutput,
self.gutter,
routput)
ret_val = {'line':output, 'p1':(' '.join(p1_words)), 'p2':(' '.join(p2_words))}
return ret_val
if __name__ == '__main__':
t1 = "this is a very long line of text much larger than you can fit on one line"
t2 = "this is another long line, only this line is a little different from the first line"
test = format_lines(t2, t1)
我想我明白您的要求。 您想在列中自動換行,就像在單元格中有一段文本時,Excel一樣。 我認為這個食譜可以幫助您入門; 它似乎可以滿足您的所有需求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.