Google、Stack Overflow、およびPythonユーザーガイドを検索しましたが、質問に対する簡単で実用的な答えは見つかりませんでした。
Windows 7 x64マシンでファイルc:\ goat.txtを作成し、そのファイルに「テスト」を印刷しようとしています。 StackOverflowで提供されている例に基づいて、次のことを試しました。
この時点で、バイナリ条件に基づいて単純なログを作成するためのドキュメントから理解できないので、ログモジュールを使用したくありません。印刷は簡単ですが、出力のリダイレクト方法は明らかではありません。
インタプリタに入力できるシンプルで明確な例が最も役立ちます。
また、情報サイトに関する提案は歓迎します(pydocsではありません)。
import sys
print('test', file=open('C:\\goat.txt', 'w')) #fails
print(arg, file=open('fname', 'w')) # above based upon this
print>>destination, arg
print>> C:\\goat.txt, "test" # Fails based upon the above
Python 2.5以前の場合は、ファイルを開いて、リダイレクトでファイルオブジェクトを使用します。
log = open("c:\\goat.txt", "w")
print >>log, "test"
Python 2.6または2.7を使用している場合は、関数としてprintを使用できます。
from __future__ import print_function
log = open("c:\\goat.txt", "w")
print("test", file = log)
Python 3.0以降を使用している場合は、将来のインポートを省略できます。
印刷ステートメントをグローバルにリダイレクトする場合は、sys.stdoutを設定できます。
import sys
sys.stdout = open("c:\\goat.txt", "w")
print ("test sys.stdout")
all印刷の出力をリダイレクトするには、次のようにします。
import sys
with open('c:\\goat.txt', 'w') as f:
sys.stdout = f
print "test"
ややハッカー的な方法(上記の回答とは異なり、すべて有効です)は、コンソールを介して出力をファイルに送信するだけです。
あなたがmain.py
を持っていると想像してください
if True:
print "hello world"
else:
print "goodbye world"
できるよ
python main.py >> text.log
そして、text.logはすべての出力を取得します。
これは、既に大量の印刷ステートメントがあり、それらを個別に変更して特定のファイルに印刷したくない場合に便利です。上位レベルでそれを行い、すべての印刷をファイルに送信します(唯一の欠点は、単一の宛先にしか印刷できないことです)。
以前の回答に基づいて、(シンプルな)コンテキストマネージャースタイルを行うための完璧なユースケースだと思います。
import sys
class StdoutRedirection:
"""Standard output redirection context manager"""
def __init__(self, path):
self._path = path
def __enter__(self):
sys.stdout = open(self._path, mode="w")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
sys.stdout.close()
sys.stdout = sys.__stdout__
その後:
with StdoutRedirection("path/to/file"):
print("Hello world")
また、いくつかの機能をStdoutRedirection
クラスに追加するのは非常に簡単です(たとえば、パスを変更できるメソッド)
file
関数でprint
引数を使用すると、印刷ごとに異なるファイルを使用できます。
print('Redirect output to file', file=open('/tmp/example.log', 'w'))
from __future__ import print_function
log = open("s_output.csv", "w",encoding="utf-8")
for i in range(0,10):
print('\nHeadline: '+l1[i]', file = log)
「 'charmap' codec ca n't encoding characters position 12-32:character maps to」のエラーを回避するために、encoding="utf-8"
を追加してください
o = open('outfile','w')
print('hello world', file=o)
my $printname = "outfile"
open($ph, '>', $printname)
or die "Could not open file '$printname' $!";
print $ph "hello world\n";
これらの簡単な2行のコードを編集せずに、すべての印刷ステートメントで使用する必要がある.... openで使用するものに置き換えないでください。それは私には役に立たないでしょう-自分のコメントや返信を追加してください。私の場合、1つの入力ファイルに対して2つの出力ファイルを一度開いてから、2番目の入力ファイルのためにそれらを一度閉じてから開き、ルーチンを再度ループしました。