ファイルに書き込むときに、Pythonで新しい行を指定するにはどうすればよいですか?


313

(文字列の)Javaと比較すると、のようになり"First Line\r\nSecond Line"ます。

では、通常のファイルに複数行を書き込むために、Pythonでそれをどのように行うのでしょうか。


12
何を試しましたか?うまくいきましたか?(私はそうではないと思います、またはあなたが尋ねることはないでしょう。)何が起こりましたか?
グレッグ・ヒューギル2012

それを行うための正しい方法と間違った方法があるかどうかを知りたかっただけですが、まだ試していませんでした。
FabianCook 2012

5
Python がJavaのprintようSystem.out.printlnに動作し、テキストの後に改行が自動的に追加されることをご存知ですか?
グレッグヒューギル2012

私はそれをファイルを書くためにそれを望みます:)
FabianCook '16

2
printPython のステートメントは、ファイルへの書き込みにも使用できます(詳細はPython 2.xとPython 3.xで異なるため、ご使用のバージョンのリファレンスドキュメントで確認してください)。printPythonの2.xで - printPythonの3.xでは
グレッグHewgill

回答:


357

それはあなたがどのようになりたいかによって異なります。\n通常は仕事をします。本当に正しくしたい場合は、osパッケージで改行文字を検索します。(実際にはと呼ばれlinesepます。)

注:Python APIを使用してファイルに書き込む場合は、を使用しないでくださいos.linesep。使用するだけ\nです。Pythonはそれを自動的にプラットフォームに適した改行文字に変換します。


14
あなたが提供したリンクから、「テキストモードで開いたファイルを書き込むときにos.linesepを行末記号として使用しないでください(デフォルト)。すべてのプラットフォームで、代わりに単一の '\ n'を使用してください。」では、「正しい」とはどういう意味ですか。また、彼らとコメントの理由は何ですか。
Yasen 2014年

21
@八千:Windowsでは、改行シーケンスは"\r\n"です。これはにos.linesepなることを意味します"\r\n"。テキストモードでファイルに書き込む場合、書き込み時に改行変換を行います。つまり"\n"、出力のそれぞれが"\r\n"結果のファイルで変換されます。あなたが書いているテキストがすでに"\r\n"シーケンスを含んでいる場合、これがどのように問題であるかを見ることができます:結果は"\r\r\n"すべての行の終わりになります。少なくとも、私は実際には試していません。
Nate CK、

すでに答えを修正し、間違ったos.linesep提案を削除する時がきたのではないでしょうか?それは大きなドラマではなく、作者のプライドはあまり
影響

8
あなたは私の誇りを知りません。しかし、もっと真剣に、linesepシステム行セパレーターが何であるかを見つけることができるように、そこに存在することに注意することは有用だと思います。
チャーリーマーティン

2
@ZABすべての文字列がテキストモードでファイルに書き込まれるわけではありません。linesepまだ便利です。
カイルストランド

61

改行文字は \nです。文字列内で使用されます。

例:

    print('First line \n Second line') 

\n改行文字はどこですか。

これは結果をもたらすでしょう:

First line
 Second line

Python 2を使用する場合は、print関数で括弧を使用しません。


7
提案として、「空白」を指定しない場合、\ n 2行目にスペースインデントが1つもありません。私が意味したことは、「最初の行\ n2行目」を印刷する
Manoj Kumar

文字列内でエスケープされた「\ n」文字を使用するよう指摘していただきありがとうございます。私のような新しいPythonの子供たちに、おそらく明白ではありません
GrayedFox

3
@ all / anyone / ManojKumar a = 1; b = 2; print(a、 "\ n"、b); o / p:1 2(2は空白スペースインデントが1つある新しい行にありますが、適切に表示されていませんが、1と2が2つの空白スペースインデントが1つある別の行にあると想定しています)この場合、スペース(1スペースインデント)は2の前にあり、1でインデントされます。注:2つの印刷ステートメントは使用せず、1と2は別々の(新しい)行にあります。
PRAFUL ANAND

24

新しい行に個別に書き込むことも、単一の文字列内に書き込むこともできます。

例1

入力

line1 = "hello how are you"
line2 = "I am testing the new line escape sequence"
line3 = "this seems to work"

'\ n'を個別に書くことができます:

file.write(line1)
file.write("\n")
file.write(line2)
file.write("\n")
file.write(line3)
file.write("\n")

出力

hello how are you
I am testing the new line escape sequence
this seems to work

例2

入力

他の人が以前の回答で指摘したように、\ nを文字列の関連するポイントに配置します。

line = "hello how are you\nI am testing the new line escape sequence\nthis seems to work"

file.write(line)

出力

hello how are you
I am testing the new line escape sequence
this seems to work

あなたの出力は技術的に正しくないと思います。2行目と3行目は、最初の文字の左側に1つの空白を入れて印刷する必要があります。別の解決策は、行変数からこれら2つのスペースを削除することです。
クリスチャンウェストブルック

とにかく、例2のコードは、表示されたとおりの出力を生成しません。
クリスチャンウェストブルック

10

一度に数行のテキストを入力する場合は、これが最も読みやすい形式であると思います。

file.write("\
Life's but a walking shadow, a poor player\n\
That struts and frets his hour upon the stage\n\
And then is heard no more: it is a tale\n\
Told by an idiot, full of sound and fury,\n\
Signifying nothing.\n\
")

各行の終わりの\は、新しい行をエスケープします(これによりエラーが発生します)。


括弧内なので、行をエスケープする必要はありません。文字列を終了し、新しい行に移動して、新しい行を開始するだけです。追加の新しい行はなく、エスケープする必要はありません。また、上記を行った場合でも、改行文字とエスケープは互いに取り消されるだけです。
user144153

9

Pythonでは、改行文字、つまり \n


3
@maazza:書くことについての質問ではありませんか?
mhawke

9

最も簡単なソリューション

print引数なしでのみ呼び出すと、空白行が出力されます。

print

パイプを使用して、次のようなファイルに出力できます(例を考慮してください)。

f = open('out.txt', 'w')
print 'First line' >> f
print >> f
print 'Second line' >> f
f.close()

OSに依存しないだけでなく(osパッケージを使用する必要もありません)、\n文字列内に置くよりも読みやすくなっています。

説明

print()関数が呼び出され、文字列の終わりのためのオプションのキーワード引数、持ってendいるなどのためのOSの改行文字、デフォルトを、。\n。したがって、を呼び出すとprint('hello')、Pythonは実際にを印刷し'hello' + '\n'ます。つまり、print引数なしで呼び出すと、実際に'' + '\n'はが出力され、改行が生成されます。

オルタナティブ

複数行の文字列を使用します。

s = """First line
    Second line
    Third line"""
f = open('out.txt', 'w')
print s >> f
f.close()

6

プラットフォームに依存しないラインブレーカー:Linux、Windows、IOS

import os
keyword = 'physical'+ os.linesep + 'distancing'
print(keyword)

出力:

physical
distancing

4

と同じ方法ですが'\n'、おそらくは必要ありません'\r'。あなたがあなたのJavaバージョンでそれを持っている理由はありますか?必要な場合は、Pythonでも同じように使用できます。


1
\r改行です。新しい行のシステムプロパティを取得すると、次のように表示されます\r\n
FabianCook

4
@SmartLemon:それはおそらくWindowsに当てはまります\nが、他のほとんどのシステムでは唯一の改行文字です。
グレッグヒューギル2012

@Jean-MichaëlCelerier:Mac OS X以前はそうでした。MacOS Xはを使用してい\nます。
グレッグヒューギル2013

わかりました、コメントを削除します。その場合、それは本当に役に立ちません。ごめんなさい!
ジャンマイケルCelerier

4

\ n-単純な改行文字の挿入が機能します:

# Here's the test example - string with newline char:
In [36]: test_line = "Hi!!!\n testing first line.. \n testing second line.. \n and third line....."

# Output:
In [37]: print(test_line)

Hi!!!
 testing first line..
 testing second line..
 and third line.....

2

Javaからの文字列リテラルのほとんどのエスケープ文字は、「\ r」や「\ n」などのPythonでも有効です。


PythonとJavaはCの影響を受けており、この言語から彼らにもたらされたからです。詳細については
Alex.K

1

他の回答で述べたように、「改行文字は\ nです。これは文字列内で使用されます」。

最も簡単で読みやすい方法は、 "format"関数を使用して、新しい行の名前としてnlを使用し、印刷する文字列を、印刷する文字列に正確に分解することです。

print("line1{nl}"
      "line2{nl}"
      "line3".format(nl="\n"))

それは出力します:

line1
line2
line3

このようにしてタスクを実行し、コードの読みやすさも向上させます:)


0

\ n文字列の行を区切ります。次の例では、レコードをループで書き込み続けます。各レコードはで区切られ\nます。

f = open("jsonFile.txt", "w")

for row_index in range(2, sheet.nrows):

  mydict1 = {
    "PowerMeterId" : row_index + 1,
    "Service": "Electricity",
    "Building": "JTC FoodHub",
    "Floor": str(Floor),
    "Location": Location,
    "ReportType": "Electricity",
    "System": System,
    "SubSystem": "",
    "Incomer": "",
    "Category": "",
    "DisplayName": DisplayName,
    "Description": Description,
    "Tag": tag,
    "IsActive": 1,
    "DataProviderType": int(0),
    "DataTable": ""
  }
  mydict1.pop("_id", None)
  f.write(str(mydict1) + '\n')

f.close()

0

対話型のpythonシェルまたはJupyterノートブックを使用して文字列を検査すると、\nなどのバックスラッシュ付きの文字列\t文字通りレンダリングされることに注意してください。

>>> gotcha = 'Here is some random message...'
>>> gotcha += '\nAdditional content:\n\t{}'.format('Yet even more great stuff!')
>>> gotcha
'Here is some random message...\nAdditional content:\n\tYet even more great stuff!'

改行、タブ、およびその他の特殊な非印刷文字は、印刷時またはファイルへの書き込み時にのみ空白としてレンダリングされます。

>>> print('{}'.format(gotcha))
Here is some random message...
Additional content:
    Yet even more great stuff!
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.