如何在Python 3.6中创建自动换行程序

时间:2018-11-06 05:58:35

标签: python python-3.x pycharm

我正在尝试创建一个程序来模拟在Word或记事本之类的程序中找到的自动换行文本。如果文本较长,我希望每行打印64个字符(或更少),然后返回换行符,且不截断单词。使用Windows 10,PyCharm 2018.2.4和Python 3.6,我尝试了以下代码:

long_str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit," \
       "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." \
       "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris" \
       "nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in" \
       "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur." \
       "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui" \
       "officia deserunt mollit anim id est laborum."

concat_str = long_str[:64] # The first 64 characters
rest_str = long_str[65:] # The rest of the string

rest_str_len = len(rest_str)

while rest_str_len > 64:
    print(concat_str.lstrip() + " (" + str(len(concat_str)) + ")" + "\n")
    concat_str = rest_str[:64] 
    rest_str = rest_str[65:] 
    rest_str_len = len(rest_str) 

print(concat_str.lstrip() + " (" + str(len(concat_str)) + ")" + "\n")
print(rest_str.lstrip() + " (" + str(len(rest_str)) + ")")

这是如此接近,但是有两个问题。首先,代码会在行尾或行首截断字母,例如以下输出:

# I've added the total len() at the end of each line just to check-sum.
 'Lorem ipsum dolor sit amet, consectetur adipiscing elit,sed do e (64)'
 'usmod tempor incididunt ut labore et dolore magna aliqua. Ut enim (64)'
 'ad minim veniam, quis nostrud exercitation ullamco laborisnisi u (64)'
 'aliquip ex ea commodo consequat. Duis aute irure dolor inrepreh (64)'
 'nderit in voluptate velit esse cillum dolore eu fugiat nulla par (64)'
 'atur. Excepteur sint occaecat cupidatat non proident, sunt in cul (64)'
 'a quiofficia deserunt mollit anim id est laborum. (49)'

第二个问题是我需要代码仅在整个单词(或标点符号)之后打印换行符,而不是将单词切成64个字符。

1 个答案:

答案 0 :(得分:3)

使用textwrap.wrap

import textwrap

long_str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit," \
       "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." \
       "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris" \
       "nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in" \
       "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur." \
       "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui" \
       "officia deserunt mollit anim id est laborum."

lines = textwrap.wrap(long_str, 64, break_long_words=False)

print('\n'.join(lines))

这需要长字符串并将其拆分为特定宽度的行。另外,将break_long_words设置为False可以防止单词分裂。