使用Python的textwrap库时,我该怎么做呢:
short line,
long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
进入这个:
short line,
long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
我试过了:
w = textwrap.TextWrapper(width=90,break_long_words=False)
body = '\n'.join(w.wrap(body))
但我明白了:
short line, long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
(我的例子中的间距不完全)
答案 0 :(得分:14)
试
w = textwrap.TextWrapper(width=90,break_long_words=False,replace_whitespace=False)
似乎解决了我的问题
我从我读到的here(我之前从未使用过textwrap)中解决了这个问题。
答案 1 :(得分:11)
body = '\n'.join(['\n'.join(textwrap.wrap(line, 90,
break_long_words=False, replace_whitespace=False))
for line in body.splitlines() if line.strip() != ''])
答案 2 :(得分:3)
如果只包含超过90个字符的行?
new_body = ""
lines = body.split("\n")
for line in lines:
if len(line) > 90:
w = textwrap.TextWrapper(width=90, break_long_words=False)
line = '\n'.join(w.wrap(line))
new_body += line + "\n"
答案 3 :(得分:1)
看起来它不支持。这段代码将扩展它以满足我的需要:
答案 4 :(得分:0)
lines = text.split("\n")
lists = (textwrap.TextWrapper(width=90,break_long_words=False).wrap(line) for line in lines)
body = "\n".join("\n".join(list) for list in lists)
答案 5 :(得分:0)
我不得不格式化动态生成的文档字符串。我想保留手工放置的新行和分割一定长度的任何行。通过@far重新修改答案,这个解决方案对我有用。我只把它包含在这里作为子孙后代:
import textwrap
wrapArgs = {'width': 90, 'break_long_words': True, 'replace_whitespace': False}
fold = lambda line, wrapArgs: textwrap.fill(line, **wrapArgs)
body = '\n'.join([fold(line, wrapArgs) for line in body.splitlines()])
答案 6 :(得分:0)
TextWrapper并非旨在处理已包含换行符的文本。
当您的文档已有换行符时,您可能想要做两件事:
1)保留旧的换行符,只包装超过限制的行。
您可以按如下方式对TextWrapper进行子类化:
class DocumentWrapper(textwrap.TextWrapper):
def wrap(self, text):
split_text = text.split('\n')
lines = [line for para in split_text for line in textwrap.TextWrapper.wrap(self, para)]
return lines
然后以与textwrap相同的方式使用它:
d = DocumentWrapper(width=90)
wrapped_str = d.fill(original_str)
给你:
short line,
long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxx
2)删除旧换行符并包装所有内容。
original_str.replace('\n', '')
wrapped_str = textwrap.fill(original_str, width=90)
给你
short line, long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
(TextWrapper不执行其中任何一项 - 它只是忽略现有的换行符,这会导致格式化的奇怪结果)
答案 7 :(得分:0)
这是一个小模块,可以包装文本,断行,处理额外的缩进(例如,项目符号列表),并用markdown替换字符/单词!
class TextWrap_Test:
def __init__(self):
self.Replace={'Sphagnum':'$Sphagnum$','Equisetum':'$Equisetum$','Carex':'$Carex$',
'Salix':'$Salix$','Eriophorum':'$Eriophorum$'}
def Wrap(self,Text_to_fromat,Width):
Text = []
for line in Text_to_fromat.splitlines():
if line[0]=='-':
wrapped_line = textwrap.fill(line,Width,subsequent_indent=' ')
if line[0]=='*':
wrapped_line = textwrap.fill(line,Width,initial_indent=' ',subsequent_indent=' ')
Text.append(wrapped_line)
Text = '\n\n'.join(text for text in Text)
for rep in self.Replace:
Text = Text.replace(rep,self.Replace[rep])
return(Text)
Par1 = "- Fish Island is a low center polygonal peatland on the transition"+\
" between the Mackenzie River Delta and the Tuktoyaktuk Coastal Plain.\n* It"+\
" is underlain by continuous permafrost, peat deposits exceede the annual"+\
" thaw depth.\n* Sphagnum dominates the polygon centers with a caonpy of Equisetum and sparse"+\
" Carex. Dwarf Salix grows allong the polygon rims. Eriophorum and carex fill collapsed ice wedges."
TW=TextWrap_Test()
print(TW.Wrap(Par1,Text_W))
将输出:
鱼岛是一个低中心的多边形泥炭地 麦肯齐河三角洲与河流之间的过渡 Tuktoyaktuk沿海平原。
它是连续的永久冻土,泥炭 存款超过年度解冻深度。
$ Sphagnum $用多边形中心控制多边形中心 $ Equisetum $和稀疏$ Carex $的caonpy。矮人$ Salix $ 在多边形轮辋上增长。 $ Eriophorum $和 carex填充冰楔。
例如,如果您在matplotlib中工作,则$$之间的字符将以斜体显示,但是,因为它们在之后添加,所以$$不会计入行间距!
所以,如果你这样做了:
fig,ax = plt.subplots(1,1,figsize = (10,7))
ax.text(.05,.9,TW.Wrap(Par1,Text_W),fontsize = 18,verticalalignment='top')
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)