私は慣れています print >>f, "hi there"
ただし、print >>
サポートが終了しているようです。上記の行を実行するための推奨される方法は何ですか?
更新:これらのすべての回答について"\n"
...これはユニバーサルですか、Unix固有ですか?IE、"\r\n"
Windows で実行する必要がありますか?
私は慣れています print >>f, "hi there"
ただし、print >>
サポートが終了しているようです。上記の行を実行するための推奨される方法は何ですか?
更新:これらのすべての回答について"\n"
...これはユニバーサルですか、Unix固有ですか?IE、"\r\n"
Windows で実行する必要がありますか?
回答:
これは次のように単純でなければなりません。
with open('somefile.txt', 'a') as the_file:
the_file.write('Hello\n')
ドキュメントから:
os.linesep
テキストモード(デフォルト)で開いたファイルを書き込むときに、行末記号として使用しないでください。すべてのプラットフォームで、代わりに単一の '\ n'を使用してください。
いくつかの有用な読み物:
with
声明open()
os
(特にos.linesep
)with
すると、ファイルを閉じることを覚えておくと安全です。
the_file.close()
か?
print()
Python 2.6以降で使用可能な関数を使用する必要があります
from __future__ import print_function # Only needed for Python 2
print("hi there", file=f)
Python 3 import
では、print()
関数がデフォルトであるため、 は必要ありません。
別の方法としては、次のものを使用します。
f = open('myfile', 'w')
f.write('hi there\n') # python will convert \n to os.linesep
f.close() # you can omit in most cases as the destructor will call it
改行に関するPythonドキュメントからの引用:
出力では、改行がNoneの場合、
'\n'
書き込まれた文字はすべてシステムのデフォルトの行区切り文字に変換されますos.linesep
。改行がの場合''
、変換は行われません。改行が他の正当な値のいずれかである場合、'\n'
書き込まれた文字はすべて、指定された文字列に変換されます。
\n
"require require newline ="の代わりにos.linesepを追加\r\r\n
します。そうしないと、Windowsで発生します。os.linesepで混乱する理由はまったくありません。
\r\n
を含む書き込みと同じです。\n
これはos.linesepに変換される\r\n
ため、最終結果は\r\r\n
です。
open('myfile','a')
代わりにそれを追加しないでopen('myfile','w')
ください?
Pythonのドキュメントには、この方法をお勧めします。
with open('file_to_write', 'w') as f:
f.write('file contents\n')
したがって、これは私が通常行う方法です:)
ファイルオブジェクトを処理するときは、「with」キーワードを使用することをお勧めします。これには、途中で例外が発生した場合でも、スイートが終了した後にファイルが適切に閉じられるという利点があります。また、同等のtry-finallyブロックを作成するよりもはるかに短くなります。
with
ループの内側にネストする必要があるときは、この方法は好きではありません。これにより、ループの進行中は常にファイルを開いたり閉じたりできます。多分私はここで何かを見逃しているのでしょうか、それともこの特定のシナリオでは本当に不利なのでしょうか?
os.linesepについて:
以下は、Windowsでの編集されていない正確なPython 2.7.1インタープリターセッションです。
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.linesep
'\r\n'
>>> f = open('myfile','w')
>>> f.write('hi there\n')
>>> f.write('hi there' + os.linesep) # same result as previous line ?????????
>>> f.close()
>>> open('myfile', 'rb').read()
'hi there\r\nhi there\r\r\n'
>>>
Windowsの場合:
予想通り、os.linesepはと同じ結果を生成しません'\n'
。それが同じ結果をもたらすことができる方法はありません。はと同等ですが、'hi there' + os.linesep
と同等'hi there\r\n'
ではありません'hi there\n'
。
これは簡単です\n
。自動的にos.linesepに変換されるuseです。そして、PythonからWindowsへの最初の移植以来、それは非常に単純なことです。
Windows以外のシステムでos.linesepを使用しても意味がなく、Windowsで誤った結果が生成されます。
os.linesepは使用しないでください!
os.linesep
、テキストモードのWindowsで明示的に使用した場合、結果\r\r\n
が正しくないということです。「Windowsは...を使用しています」は意味がありません。Cランタイムライブラリ(したがってPython)は、テキストモードでの出力時に変換\n
さ\r\n
れます。他のソフトウェアは異なる動作をする場合があります。Windowsで実行されているすべてのソフトウェアが\n
、テキストモードで読み取るときに、1つを行区切り文字として認識するわけではありません。Pythonはそうします。Microsoftのメモ帳テキストエディターはサポートしていません。
\r
。エキストラについてバーフするミッキーマウスソフトウェアがいくつかあります...
os.linesep
は明示的に言うのは「間違っています」。そのようなDepartment of Redundancy Department
。はい、できます。いいえ、したくありません。
with
範囲外になると、ファイルが閉じられます。
open(..., 'a')
偶数か'at'
。
大量のデータを書き込んでいて、速度が問題になる場合は、おそらくこれを使用してくださいf.write(...)
。速度をすばやく比較したところprint(..., file=f)
、大量の書き込みを実行する場合よりもかなり高速でした。
import time
start = start = time.time()
with open("test.txt", 'w') as f:
for i in range(10000000):
# print('This is a speed test', file=f)
# f.write('This is a speed test\n')
end = time.time()
print(end - start)
write
私のマシンでは平均して2.45秒で終了しましたが、print
約4倍(9.76秒)かかりました。そうは言っても、ほとんどの実際のシナリオでは、これは問題にはなりません。
print(..., file=f)
あなたが一緒に行くことを選択した場合は、おそらく改行を時々抑制するか、それを別のものに置き換えたいと思うでしょう。これは、オプションのend
パラメーターを設定することで実行できます。
with open("test", 'w') as f:
print('Foo1,', file=f, end='')
print('Foo2,', file=f, end='')
print('Foo3', file=f)
どちらの方法を選択しwith
ても、コードが非常に読みやすくなるので、使用することをお勧めします。
更新:このパフォーマンスの違いwrite
は、高度にバッファリングされ、ディスクへの書き込みが実際に行われる前に返される(この回答を参照)という事実によって説明されますが、print
(おそらく)ラインバッファリングを使用します。これに対する簡単なテストは、長い書き込みのパフォーマンスもチェックすることです。この場合、ラインバッファリングの(速度の点で)不利な点はそれほど顕著ではありません。
start = start = time.time()
long_line = 'This is a speed test' * 100
with open("test.txt", 'w') as f:
for i in range(1000000):
# print(long_line, file=f)
# f.write(long_line + '\n')
end = time.time()
print(end - start, "s")
パフォーマンスの違いは、顕著ではなくなり、平均時間は2.20秒write
、3.10秒ですprint
。ひとまとまりの文字列を連結してこの大げさな行のパフォーマンスを得る必要がある場合、print
より効率的なユースケースは少しまれです。
Lineとは、「\ n」文字で終わるシリアル化された文字を意味します。行はある時点で最後でなければならないので、各行の終わりで「\ n」を考慮する必要があります。これが解決策です:
with open('YOURFILE.txt', 'a') as the_file:
the_file.write("Hello")
追加モードでは、各書き込み後にカーソルが新しい行に移動します。w
モードを使用する場合\n
は、write()
関数の最後に文字を追加する必要があります。
the_file.write("Hello\n")
フラスコ内のファイルにテキストを書き込むには、次の方法を使用できます。
filehandle = open("text.txt", "w")
filebuffer = ["hi","welcome","yes yes welcome"]
filehandle.writelines(filebuffer)
filehandle.close()
新しい行をたくさん書く必要があるときは、print
関数を使用するラムダを定義します。
out = open(file_name, 'w')
fwl = lambda *x, **y: print(*x, **y, file=out) # FileWriteLine
fwl('Hi')
このアプローチには、print
関数で使用可能なすべての機能を利用できるという利点があります。
更新:としては、言及されたゲオルギーコメントセクションでは、とさらにこのアイデアを向上させることができるpartial
機能。
from functools import partial
fwl = partial(print, file=out)
私見、これはより機能的で、より不可解なアプローチです。
from functools import partial; fwl = partial(print, file=out)
。