Как перенаправить вывод печати в файл TXT - PullRequest
58 голосов
/ 06 ноября 2010

Я искал Google, Stack Overflow и мое руководство пользователя Python и не нашел простого, работоспособного ответа на вопрос.

Я создал файл c: \ goat.txt на компьютере с Windows 7 x64и я пытаюсь напечатать «test» в файл.Я попробовал следующее на основе примеров, представленных на StackOverflow:

На данный момент я не хочу использовать модуль журнала, так как из документации не понимаю, как создать простой журнал на основе двоичного файла.состояние.Печать проста, однако, как перенаправить вывод, неочевидно.

Простой, понятный пример, который я могу ввести в свой интерпретатор, является наиболее полезным.

Также, любые предложения для информационных сайтовценится (НЕ ПИДОК).

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

Ответы [ 8 ]

107 голосов
/ 06 ноября 2010

Если вы используете 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")
47 голосов
/ 06 ноября 2010

Чтобы перенаправить вывод для всех отпечатков, вы можете сделать это:

import sys
with open('c:\\goat.txt', 'w') as f:
    sys.stdout = f
    print "test"
15 голосов
/ 25 октября 2014

Немного более хакерский способ (который отличается от приведенных выше ответов, и все они действительны) - просто направить вывод в файл через консоль.

Итак, представьте, что у вас было main.py

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

Вы можете сделать

python main.py >> text.log

и тогда text.log получит все выходные данные.

Это удобно, если у вас уже есть куча операторов печати, и вы не хотите индивидуально изменять их для печати в определенном файле. Просто сделайте это на верхнем уровне и направьте все отпечатки в файл (недостатком является то, что вы можете печатать только в одном месте).

3 голосов
/ 15 октября 2018

Основываясь на предыдущих ответах, я думаю, что это идеальный вариант использования для этого (простого) стиля менеджера контекста:

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 (например, метод, который позволяет вам изменить путь)

3 голосов
/ 22 ноября 2017

Используя аргумент file в функции print, вы можете иметь разные файлы на печать:

print('Redirect output to file', file=open('/tmp/example.log', 'w'))
1 голос
/ 07 июня 2019
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)

Пожалуйста, добавьте encoding="utf-8", чтобы избежать ошибки кодека '' charmap ', который не может кодировать символы в позиции 12-32: символы отображаются на "

1 голос
/ 09 марта 2019

просто в питоне 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 СТРОКИ КОДА и замените их чем-то, что вы должны использовать с .... открытым для каждого оператора печати Это не было бы полезно для меня - просто добавьте свой комментарий или ответ. В моем случае я открыл два выходных файла один раз для одного входного файла, затем закрыл и снова открыл их для второго входного файла и снова повторил процедуру.

0 голосов
/ 26 июня 2014

Перенаправьте sys.stdout на дескриптор открытого файла, а затем весь печатный вывод перейдет в файл:

import sys
filename  = open("outputfile",'w')
sys.stdout = filename
print "Anything printed will go to the output file"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...