2013-08-03 14 views
10

入力ファイルに余分な改行を追加しています各項目の間に余分な線があります。Pythonは出力

これを防止するにはどうすればよいですか?

答えて

12

printは改行を付加し、入力ラインはすでに改行で終わる:あなたは改行を取り除くことができます。

import sys 

with open("a.txt") as f: 
    for line in f: 
     sys.stdout.write(line) 

PS:Pythonの3(または印刷機能付きのPython 2)については、abarnertのprint(…, end='')溶液は、最も簡単なものである

標準溶液は、出力にそのまま入力ラインです。あなたはまた、splitlines()機能を試すことができ

+0

OPは明らかにPython 2を使用しています。2.xユーザー向けに 'print_function'を提案することは常に良い考えです。 'print'の魔法のソフトスペースを使うのは、もしそれが何を意味し、どのように働くのかを最初に学ばなければ、おそらく悪い考えです。あなたの明示的な 'write'が最良の答えかもしれないことを意味します(私はあなたの答えをupvotedし、OPはそれを受け入れることが正しいと思います)。 – abarnert

+0

REF https://docs.python.org/2/library/functions.html#print –

0

改行は追加されませんが、ファイルの各走査線には末尾の行が付きます。

てみ:

with open ("a.txt") as f: 
    for line in (x.rstrip ('\n') for x in f): 
     print line 
+0

改行文字が '\ n'でないため、これはWindows(またはOS X以前のMac OS)では失敗します。 – EOL

+1

これは、ファイルa.txtが存在しない場合にも失敗します。 – Hyperboreus

+1

@Ele AFAIK、私は間違っているかもしれませんが、Pythonでテキストモードで開いたファイルは、すべての行末が暗黙的に '\ n'に変換されています。 – Hyperboreus

2

何が起こるかというと末尾の改行、およびPythonでprintステートメントとして、各行でも改行を追加することです。

with open("a.txt") as f: 
    for line in f: 
     print line.strip() 
+0

'strip()'も先行する空白を削除するので、空白で始まる行が含まれている場合、この解決法は入力ファイルを正しく印刷できません。実際には 'rstrip()'が必要です。 'rstrip()'はあまり良くありません。改行(良い)は削除されますが、末尾の空白は入力ファイルの行をいくつかの望ましくない方法で変更するので、 'rstrip必要なことを完全に行います。 – EOL

1

、それが自動的にストリップ:他の回答は説明

f = open('a.txt').read() 
for l in f.splitlines(): 
    print l 
+1

これは、複数のオペレーティングシステムのさまざまな改行規則を正しく処理しますが、Python 2とPython 3の両方で、この解決策は大量のメモリ:ファイル全体がメモリに読み込まれるだけでなく、その行のリストを通してコピーが作成されます。したがって、これはうまくいく方法ですが、それほど大きくないファイルに対してのみです。この解決策が他の回答のように「with」を使用した場合、メモリは最終的に解放されることに注意してください。 – EOL

+0

@EOL: 'with'はメモリの解放に影響しません。ファイルを閉じるかどうかに関わらず、巨大な 'f'文字列はまったく同じ時間量だけ生きています。 (もちろん、ファイルハンドルが漏れないようにすることは良い考えです。これは 'f'や' f.splitlines'のGCには関係ありません) – abarnert

+0

@abarnert:そうです。私はなぜメモリが 'with 'で解放されるのか(なぜなら、関与するメモリ量は実際には無視できる)と書いたのか分かりません。 – EOL

6

として、各行は改行を持っています。あなたがprintの裸の文字列の場合、最後に行が追加されます。これには2つの方法があります。他のすべては、同じ2つのアイデアのバリエーションです。あなたがそれらを読むよう


まず、あなたは改行を取り除くことができます。

with open("a.txt") as f: 
    for line in f: 
     print line.rstrip() 

これは、スペースやタブなどの他の末尾の空白、だけでなく、改行を削除します。通常、これは気にしません。そうした場合、あなたはおそらく、ユニバーサル改行モードを使用すると、改行剥ぎ取る:

with open("a.txt", "rU") as f: 
    for line in f: 
     print line.rstrip('\n') 

ただし、テキストファイルがあることがわかっている場合は、たとえば、Windowsの改行ファイル、またはネイティブにしますファイルプラットフォーム - 私は - ランニング・オン・右今-改行--whichever、明示的に適切な終末を取り除くことができます。

with open("a.txt") as f: 
    for line in f: 
     print line.rstrip('\r\n') 

with open("a.txt") as f: 
    for line in f: 
     print line.rstrip(os.linesep) 

それを行うための他の方法は、元の改行を残すことです余分なものは印刷しないでください。これはsys.stdoutsys.stdout.write(line)と書いて行うことができますが、printからでも行うことができます。

printステートメントの末尾にコンマを追加するだけで、改行を印刷するのではなく、「スマートスペース」が追加されます。 Exactly what that meansはややこしいですが、考えなければならないときはスペースを追加し、そうでなければ何もしないという考えがあります。最もDWIMアルゴリズムと同様に、それは常に物事を取得していない右が、この場合には、それがない:

with open("a.txt") as f: 
    for line in f: 
     print line, 

はもちろん、我々は今、ファイルの改行があなた一致していることを想定しているterminal'sを-場合はでこれを試してみてください、 Unix端末上の古典的なMacファイルを使用すると、最後の行に印刷する各行が終了します。ここでも、普遍的な改行を使用して回避することができます。

とにかく、printステートメントの代わりにprint関数を使うことで、スマートスペースのDWIMマジックを避けることができます。

from __future__ import print_function 
with open("a.txt") as f: 
    for line in f: 
     print(line, end='') 

それとも好む場合は、sixのようなサードパーティ製のラッパーライブラリを使用することができますPythonの2.xでは、あなたは__future__宣言を使用してこれを取得します。

+0

'\ r'を取り除くのは、ファイルをテキストモードで開いたため意味がありません。' \ r'文字は削除する前に削除されています。テキストファイルにはPython 2とバイナリモードでのみ有効です(Python 3とは互換性がありません) –

関連する問題