Tho*_*obs 4 python printing lines python-3.x
Python 3可以轻松处理打印大量文本:
text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vitae odio quis felis consectetur blandit. Etiam mattis vehicula ex id sodales. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris fermentum semper nisi vel aliquam. Ut nec facilisis lectus. Maecenas auctor blandit condimentum. Donec finibus orci ac imperdiet congue. Pellentesque sem leo, commodo non metus ac, posuere maximus lorem. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. "
print(text)
Run Code Online (Sandbox Code Playgroud)
问题是此文本的打印方式如下:
当然,这对于文本的可读性不是很好。手工遍历所有文本以插入白线非常麻烦。我已经看到了这个问题,但是我想知道是否可以选择自动执行此操作。
如评论中所述,pprint并且textwrap可以用于将输出对齐到给定的宽度。鉴于此,唯一的技巧就是确定要使用的宽度。您可以只使用78或80并假设窗口那么大,但是如果终端较小,则意味着包装不当,如果终端较大,则意味着浪费了空间。
要检查的实际宽度与使用pprint/ textwrap,如果你对Python的3.3或更高版本,可以使用shutil.get_terminal_size:
import shutil
def get_terminal_columns():
return shutil.get_terminal_size().columns
Run Code Online (Sandbox Code Playgroud)
如果不能使用3.3+,则可以使用该curses模块以更复杂的方式确定尺寸:
import curses
def get_terminal_columns():
try:
# Initialize curses for terminal and check dimensions
rows, cols = curses.initscr().getmaxyx()
finally:
# Unload curses to release control of terminal so it behaves normally
curses.endwin()
return cols
Run Code Online (Sandbox Code Playgroud)
使用这些功能之一,然后可以定义:
from __future__ import print_function # Only needed on Py2
import textwrap
def print_autobreak(*args, sep=' '):
width = get_terminal_columns() # Check size once to avoid rechecks per "paragraph"
# Convert all args to strings, join with separator, then split on any newlines,
# preserving line endings, so each "paragraph" wrapped separately
for line in sep.join(map(str, args)).splitlines(True):
# Py3's print function makes it easy to print textwrap.wrap's result as one-liner
print(*textwrap.wrap(line, width), sep="\n")
Run Code Online (Sandbox Code Playgroud)
这会根据终端大小自动在单词之间执行换行,保留现有的“硬”换行符和空格,并print通过允许多个参数(带有可选的分隔符)来部分匹配的行为。它需要在打印之前完全实现输出字符串(原件print可以一次打印一次,从而为大量输出减少了内存使用量),但这是执行适当的全局包装的副作用。
如果您需要更完整的换行处理(因此可以在没有换行的情况下进行两次打印,而第二个打印占了第一行的长度),则您需要一个状态更好的打印机(以记住行中使用的字符)或发明一些东西一点点复杂,具有完整的curses功能。我将其保留为练习。
| 归档时间: |
|
| 查看次数: |
1402 次 |
| 最近记录: |