web-dev-qa-db-ja.com

印刷の出力をTXTファイルにリダイレクトする方法

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
59
surfdork

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")
112
Eli Courtwright

all印刷の出力をリダイレクトするには、次のようにします。

import sys
with open('c:\\goat.txt', 'w') as f:
    sys.stdout = f
    print "test"
47
kolobos

ややハッカー的な方法(上記の回答とは異なり、すべて有効です)は、コンソールを介して出力をファイルに送信するだけです。

あなたがmain.pyを持っていると想像してください

if True:
    print "hello world"
else:
    print "goodbye world"

できるよ

python main.py >> text.log

そして、text.logはすべての出力を取得します。

これは、既に大量の印刷ステートメントがあり、それらを個別に変更して特定のファイルに印刷したくない場合に便利です。上位レベルでそれを行い、すべての印刷をファイルに送信します(唯一の欠点は、単一の宛先にしか印刷できないことです)。

15
Tristan Tao

以前の回答に基づいて、(シンプルな)コンテキストマネージャースタイルを行うための完璧なユースケースだと思います。

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クラスに追加するのは非常に簡単です(たとえば、パスを変更できるメソッド)

4
z33k

file関数でprint引数を使用すると、印刷ごとに異​​なるファイルを使用できます。

print('Redirect output to file', file=open('/tmp/example.log', 'w'))
3
Flippym
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"を追加してください

1
Sijin John

python 3.6でシンプル

o = open('outfile','w')

print('hello world', file=o)

私はPerlでやったようなものを探していました

my $printname = "outfile"

open($ph, '>', $printname)or die "Could not open file '$printname' $!";

print $ph "hello world\n";

これらの簡単な2行のコードを編集せずに、すべての印刷ステートメントで使用する必要がある.... openで使用するものに置き換えないでください。それは私には役に立たないでしょう-自分のコメントや返信を追加してください。私の場合、1つの入力ファイルに対して2つの出力ファイルを一度開いてから、2番目の入力ファイルのためにそれらを一度閉じてから開き、ルーチンを再度ループしました。

1
clint