2013-05-07 13 views
21

私のプロジェクトでは、ファイルから読み込まれる一連の文字列があります。それらのほとんどは、コマンドコンソールに印刷されたときに、長さが80文字を超えてラップアラウンドして見苦しくなります。Pythonで長い文字列を改行に改行する良い方法はありますか?

私はPythonに文字列を読み込ませ、それが75文字を超えるかどうかをテストしたいと思っています。そうであれば、文字列を複数の文字列に分割し、新しい行に次々と印字します。 私はまたそれが賢明で、完全な言葉を切ってはいけません。すなわち"the quick bro<newline>wn fox..."の代わりに"The quick brown <newline> fox..."となります。

設定した長さの後に文字列を切り捨てるようなコードを修正しようとしましたが、文字列を新しい行に入れるのではなく、単に切り捨てます。

これを達成するために使用できる方法は何ですか?

+1

[textwrap](HTTP://docs.python .org/3/library/textwrap.html)はこれには最適ですが、ファイルの形式によって異なります。別々の行で、 'textwrap'を使うと、最も恐ろしいことになるでしょう –

+0

@ Ryan-Saxeそれは、各文字列がセット文字で区切られたテキストファイルです(パイプ、|)。テキストラップがうまくいくように聞こえます。 –

答えて

41

あなたはtextwrapモジュール使用できます。あなたが別の行に行をマージしたくない場合は

>>> textwrap.fill? 

Definition: textwrap.fill(text, width=70, **kwargs) 
Docstring: 
Fill a single paragraph of text, returning a new string. 

Reformat the single paragraph in 'text' to fit in lines of no more 
than 'width' columns, and return a new string containing the entire 
wrapped paragraph. As with wrap(), tabs are expanded and other 
whitespace characters converted to space. See TextWrapper class for 
available keyword args to customize wrapping behaviour. 

使用regextextwrap.fill

>>> import textwrap 
>>> strs = "In my project, I have a bunch of strings that are read in from a file. Most of them, when printed in the command console, exceed 80 characters in length and wrap around, looking ugly." 
>>> print(textwrap.fill(strs, 20)) 
In my project, I 
have a bunch of 
strings that are 
read in from a file. 
Most of them, when 
printed in the 
command console, 
exceed 80 characters 
in length and wrap 
around, looking 
ugly. 

が助け

import re 


strs = """In my project, I have a bunch of strings that are. 
Read in from a file. 
Most of them, when printed in the command console, exceed 80. 
Characters in length and wrap around, looking ugly.""" 

print('\n'.join(line.strip() for line in re.findall(r'.{1,40}(?:\s+|$)', strs))) 

# Reading a single line at once: 
for x in strs.splitlines(): 
    print '\n'.join(line.strip() for line in re.findall(r'.{1,40}(?:\s+|$)', x)) 

出力:

In my project, I have a bunch of strings 
that are. 
Read in from a file. 
Most of them, when printed in the 
command console, exceed 80. 
Characters in length and wrap around, 
looking ugly. 
+0

@ Ryan-Saxeこれは現場でのロジックですが、各行の終わりに終端文字を置いて、各文字列をリストに読み込んだり、各リストインデックスでテキストラップを実行する方法はありますか?この後、文字ストリッピングのいくつかの形式が必要かもしれませんが、ティがうまくいくように聞こえます。今すぐテスト。 –

+1

@JoshuaMerrimanは、行が90文字のようなものであれば、次の行には10があります。 –

+0

@RyanSaxe - 私のプロジェクトで行ったことは他の人にとってはうまくいくかもしれませんが、変数をそれらの配列の値に設定します。したがって、文字列がソースファイルの新しい行にあるかどうかは関係ありません。プログラムの中で独自の変数になります。 –

7

これはtextwrapモジュールが何のためにあるのかです。試してくださいtextwrap.fill(some_string, width=75)

2

これはアシュビニーの回答に似ていますが、reを使用していません:

lim=75 
for s in input_string.split("\n"): 
    if s == "": print 
    w=0 
    l = [] 
    for d in s.split(): 
     if w + len(d) + 1 <= lim: 
      l.append(d) 
      w += len(d) + 1 
     else: 
      print " ".join(l) 
      l = [d] 
      w = len(d) 
    if (len(l)): print " ".join(l) 

出力入力があなたの質問のとき:

In my project, I have a bunch of strings that are read in from a file. 
Most of them, when printed in the command console, exceed 80 characters in 
length and wrap around, looking ugly. 

I want to be able to have Python read the string, then test if it is over 
75 characters in length. If it is, then split the string up into multiple 
strings, then print one after the other on a new line. I also want it to be 
smart, not cutting off full words. i.e. "The quick brown <newline> fox..." 
instead of "the quick bro<newline>wn fox...". 
+0

答えてくれてありがとうございますが、率直に言って、 'textwrap'を使うのはテキストをラッピングする方がはるかに簡単で簡単な方法です。つまり、行の折り返しに柔軟性を持たせたい人や、独自のモジュールを開発するためにテキストラッピングの背後にあるロジックを理解したい人にとっては良いことです。 –

+1

@JoshuaMerrimanはい、これは受け入れられた答えにする必要はありません。あなたが正しい答えを受け入れる**この答えは、このソリューションを自分で実装したいと思っている人々に役立つでしょうが、それは私たちが車輪の再発明を促進する必要があるというわけではありません。これは、実際に使用した答えを受け入れない理由がありません。 – jamylak

+0

おっと、私は最後の答えを受け入れませんでしたか?私は複数の回答を受け入れることができたという印象を受けました。私は間違っていた。恐ろしく申し訳ありません! –

関連する問題