2016-06-01 9 views
2

のPython 3を簡単に大量のテキストを印刷処理することができます:これはもちろんの読みやすさのために非常に良いではありませんPython 3の印刷をコマンドプロンプトのサイズに合わせるにはどうすればよいですか?

enter image description here

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) 

は、問題は、このテキストは、次のように印刷されていることですテキスト白い線を挿入するために、手作業ですべてのテキストを読むと、かなり面倒な作業になります。 I have seen this questionですが、これを自動的に行うオプションがあるのだろうかと思います。

+2

https://docs.python.org/3/library/pprint.htmlまたはhttps://docs.python.org/3/library/textwrap.htmlを試しましたか? – jonrsharpe

答えて

1

あなたはこのGistを見ているかもしれません。

は、それに応じて、後続のprint呼び出しの文字列を分割する戻り値を使用します。

IDLEシェル

幅がsys.stdout.shell.widthで取得することができ、それは他の環境ではAttributeErrorを発生させます(あなたはその要旨を使用することになり、その場合には)

+0

追加する:IDLEシェルの幅は 'sys.stdout.shell.width'で取り出すことができ、他の環境では' AttributeError'を発生させます(この場合は要点を使用します) –

+0

編集済み:)、ありがとう。 –

+0

私の推薦は直接下にありますが、より良いフォーマットに編集が追加されているかわかりません... –

1

難しい部分は、私はそれを得るための移植可能な方法を知っていないので、コンソール(Windowsの世界)または端末(Unix)のサイズを取得することになります。 (@MaximeBが提案しGistに示すように)それは、以下のものを含む:

  • のWindows用のWindows APIからGetConsoleScreenBufferInfoの使用(ctypes.windll
  • Linuxや他のUnix

fcntl.ioctlの使用を介して、可能なコーナーケースといえば...しかし、あなたは、Windowsを使用している場合骨子は、要件のための十分な可能性がありません。

あなたは、静的な幅0を受け入れることができるかどうかの幅を、見つけたら72または80 Fまたは他の任意の値、texwrapモジュールは、トリックを行うことができる。

for i in textwrap.wrap(text, 72): 
    print i 

が与える:

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. 
3

のコメントで述べたように、pprinttextwrapは出力を整列させるために使用することができます与えられた幅。それを考えると、使用する幅を決定するのは唯一の方法です。あなたは78または80を使用して、ウィンドウがそれほど大きいと仮定することができますが、ターミナルが小さければ不正なラップを意味し、ターミナルが大きければスペースを無駄にします。

あなたは、Python 3.3以上にしている場合、あなたはshutil.get_terminal_size使用することができ、pprint/textwrapで使用するために実際の幅を確認するには:あなたは3を使用できない場合

import shutil 

def get_terminal_columns(): 
    return shutil.get_terminal_size().columns 

を。3+、あなたはやや複雑な方法でサイズを決定するためにthe curses moduleを使用することができます。これらの関数のいずれかを使用して

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 

、あなたがして定義することができます。

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") 

をこれは自動的に単語の間に改行を行い、既存の「ハード」改行とスペースを保持し、オプションのセパレータを使用して複数の引数を使用できるようにすることで、部分的にはprintの動作に一致します。印刷前に出力文字列を完全に認識する必要があります(オリジナルのprintは1枚ずつ印刷でき、巨大な出力に対してはメモリ使用量を少し減らすことができます)が、適切なグローバルラッピングを実行する副作用です。

より完全な改行処理が必要な場合(改行なしで2つの印刷が行われる可能性がありますが、2番目の改行は最初の行の長さに相当します)、ステートフルなプリンタが必要です)または完全なcursesの機能でより複雑なものを発明してください。私はそれを運動として残します。