在Python中换行多行字符串(保留现有换行符)?

在Python中换行多行字符串(保留现有换行符)?,python,string,word-wrap,Python,String,Word Wrap,考虑这个例子: import textwrap import pprint mystr=r""" First line. Second line. The third line is a very long line, which I would like to somehow wrap; wrap at 80 characters - or less, or more! ... can it really be done ??""" pprint.pprint(textwrap.wrap(

考虑这个例子:

import textwrap
import pprint

mystr=r"""
First line.
Second line.
The third line is a very long line, which I would like to somehow wrap; wrap at 80 characters - or less, or more! ... can it really be done ??"""

pprint.pprint(textwrap.wrap(mystr,80))
字符串
mystr
已经是多行字符串,因为它包含换行符;但是,如果运行此脚本,则会得到以下输出:

[' First line. Second line. The third line is a very long line, which I would like',
 'to somehow wrap; wrap at 80 characters - or less, or more! ... can it really be',
 'done ??']
。。。这意味着
textwrap.wrap
首先“连接”多行字符串(即删除其中现有的换行符),然后再对其进行包装(即按给定的字符数拆分)

如何包装多行字符串,以便保留换行符?也就是说,在这种情况下,预期输出为:

['First line.', 
 'Second line.', 
 'The third line is a very long line, which I would like to somehow wrap; wrap at',
 '80 characters - or less, or more! ... can it really be done ??']

编辑;感谢@u_mulder的评论,我尝试:

textwrap.wrap(mystr,80,replace_whitespace=False)
由此我得到:

['\nFirst line.\nSecond line.\nThe third line is a very long line, which I would like',
 'to somehow wrap; wrap at 80 characters - or less, or more! ... can it really be',
 'done ??']

换行符似乎被保留,但作为“内联”字符;因此,这里的第一个元素本身就是一个多行字符串——因此它不是我所需要的,每一行都是一个数组元素。

只需在拆分后添加换行:

import textwrap
import pprint
import itertools

mystr=r"""
First line.
Second line.
The third line is a very long line, which I would like to somehow wrap; wrap at 80 characters - or less, or more! ... can it really be done ??"""

wrapper = textwrap.TextWrapper(width = 80)
mylist = [wrapper.wrap(i) for i in mystr.split('\n') if i != '']
mylist = list(itertools.chain.from_iterable(mylist))

pprint.pprint(mylist)
输出:

['First line.',
 'Second line.',
 'The third line is a very long line, which I would like to somehow wrap; wrap at',
 '80 characters - or less, or more! ... can it really be done ??']

好吧,我想我找到了做我想做的事的方法,但这有点不公平:

import textwrap
import pprint

mystr=r"""
First line.
Second line.
The third line is a very long line, which I would like to somehow wrap; wrap at 80 characters - or less, or more! ... can it really be done ??"""

#pprint.pprint(textwrap.wrap(mystr,80,replace_whitespace=False))

aa=[]
for ix in mystr.splitlines():
  if ix:
    if len(ix)<=80: aa.append(ix)
    else: aa.extend(textwrap.wrap(ix,80))

pprint.pprint(aa)
因此:

  • 第一个元素:“第一行”,最初定义为
  • 第二个元素:“第二行”,这也是最初定义的
  • 第三个元素:原始的第三行太长,所以它被包装为80个字符,它的第一部分是数组中的第三个元素
  • 第四元素:包含原始第三行的第二部分

这就是我想要实现的;请注意,这与数组中的第一个元素包含多行(如
['\n第一行。\n第二行。\n第三行…

类似的情况,也许会有帮助,谢谢@u\u mulder-事实证明,这不是重复的;请参见OPS中的编辑只是一个旁注,行为不符合您预期的原因是(根据文档)
pprint-支持递归打印列表、元组和字典(不是字符串)。和
帮助(textwrap.wrap)
给出了“包装一段文字,返回一个包装行列表。”因此我们看到它需要输入字符串中的一段文字,而不是几个段落。谢谢,@MalikBrahimi-但我不知道这是如何包装的,比如说80个字符?你试过了吗?不,我会在几分钟内完成,给我一点时间。非常感谢@MalikBrahimi-这是可行的,但输出与我刚才在OP中所做的编辑完全相同;也就是说,如果您执行
pprint.pprint(mylist)
,你会看到数组中的第一项本身就是一个多行字符串,它不是我想要的每个元素一行;对此有什么想法吗?我可能不明白,你到底需要什么?你现在想要列表作为一个字符串吗?@MalikBrahimi-如果你坚持接受,你至少应该麻烦a)发布一个完整的comp我可以举个例子,b)发布输出-至少如果原始海报这样做了。我编辑了你的答案,并且以这种形式我可以接受它(即使为了编辑你的问题,我必须先回答我的问题,所以我可以接受它).干杯!您的解决方案非常好。您可以通过删除
ifs
来简化代码。只是:
对于mystr.splitlines()中的ix:aa+=textwrap.wrap(ix,80)
给出了相同的结果。
['First line.',
 'Second line.',
 'The third line is a very long line, which I would like to somehow wrap; wrap at',
 '80 characters - or less, or more! ... can it really be done ??']