【问题标题】:How to create a word wrapping program in Python 3.6如何在 Python 3.6 中创建自动换行程序
【发布时间】:2018-11-06 14:31:45
【问题描述】:

我正在尝试创建一个程序来模拟 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 个字符。

【问题讨论】:

    标签: python python-3.x pycharm


    【解决方案1】:

    使用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 以防止分词。

    【讨论】:

    • 这非常有效,而且非常有效! Python 的最佳特性之一是可用的库和导入的数量。但是,如果我想顽固地修复我冗长的代码,你能帮我找出截断错误吗?
    • @Andy,当然。 rest_str = rest_str[65:] 应该是 rest_str = rest_str[64:]。你能试试这个改变吗?另外,rest_str = long_str[65:]rest_str = long_str[64:] 开头。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    相关资源
    最近更新 更多