Python перенаправить вывод в файл

Python перенаправить вывод в файл

Я хочу перенаправить печать на a .txt-файл с использованием python. У меня есть цикл "for", который будет "печатать" вывод для каждого из моих .BAM-файл, пока я хочу перенаправить все эти выходные данные в один файл. Поэтому я попытался поставить

в начале моего скрипта. Однако я ничего не получаю .txt-файл. Мой скрипт:

Так в чем проблема? Любой другой способ, кроме этой системы.в stdout?

мне нужно, чтобы мой результат выглядел так:

10 ответов

самый очевидный способ сделать это-напечатать в файловый объект:

однако, перенаправление stdout также работает для меня. Это, вероятно, хорошо для одноразового скрипта, такого как это:

каково первое имя файла в вашем скрипте? Я не вижу инициализации.

мое первое предположение, что glob не находит никаких bamfiles, и поэтому цикл for не запускается. Убедитесь, что папка существует, и распечатайте bamfiles в скрипт.

кроме того, использовать os.путь.присоединяйтесь и ОС.путь.и basename для управления путями и именами файлов.

вы можете перенаправить печать с >> оператора.

в большинстве случаев вам лучше просто писать в файл нормально.

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

print(*objects, sep=’ ‘, end=’
‘, file=sys.stdout, flush=False)

на аргумент должен быть объектом с write(string) метод; если его нет или None , sys.stdout будет использоваться. Поскольку печатные аргументы преобразуются в текстовые строки print() не может использоваться с объектами файлов двоичного режима. Для этого используйте file.write(. ) вместо.

С объект file как правило, содержит write() метод, все, что вам нужно сделать, это передать объект file в свой аргумент.

Это прекрасно работает:

Теперь "Привет" будет написано тест.txt-файл. Обязательно закройте stdout С close , без него содержимое не будет сохранено в файле

самое простое решение не через python; его через оболочку. Из первой строки вашего файла ( #!/usr/bin/python ) Я предполагаю, что вы находитесь в системе UNIX. Просто используйте print операторы, как вы обычно, и не открывайте файл вообще в своем скрипте. Когда вы идете, чтобы запустить файл, а не

запустить файл, используйте

где вместо С именем файла, в который вы хотите ввести вывод. The > токен говорит (большинство) оболочки для установки stdout в файл, описанный следующим маркером.

одна важная вещь, которая должна быть упомянута здесь, это то, что "script.py" необходимо сделать исполняемый файл для ./script.py запустить.

поэтому перед запуском ./script.py выполнить следующую команду

chmod a+x script.py (сделайте скрипт исполняемым для всех пользователей)

не используйте print используйте logging

вы можете изменить sys.stdout чтобы указать на файл, но это довольно неуклюжий и негибкий способ справиться с этой проблемой. Вместо использования print используйте logging .

С logging , вы можете печатать так же, как вы бы stdout , или вы можете записать вывод в файл. Вы даже можете использовать различные уровни сообщений ( critical , error , warning , info , debug ), например, печатайте только основные проблемы на консоли, но все равно записывайте незначительные действия кода в файл.

простой пример

импорт logging , получаем logger , и установите уровень обработки:

если вы хотите напечатать в stdout:

если вы хотите также записать в файл (если вы хотите только записать в файл, пропустите последний раздел):

тогда, где бы вы ни использовали print использовать logger методы:

чтобы узнать больше об использовании более продвинутых logging особенности, читать отличные logging учебник в Python docs.

Читайте также:  Лучшие квесты fallout 3

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

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

а затем, когда вы все закончите собирать свои "строки данных" по одной строке на элемент списка, вы можете присоединиться к ним с некоторыми ‘
‘ символы, чтобы сделать все это outputtable; может даже обернуть ваше заявление выход в with блок, для дополнительной безопасности (автоматически закроет ваш выход справится даже если что-то пойдет не так):

однако, если у вас есть много данных для записи, вы мог бы напишите его по одной части за раз. Я не думаю, что это имеет отношение к вашему приложению, но вот альтернатива:

изменение значения sys.stdout изменяет назначение всех вызовов для печати. Если вы используете альтернативный способ изменения направления печати, вы получите тот же результат.

ваша ошибка где-то еще:

  • это может быть в коде, который вы удалили для своего вопроса (Откуда берется имя файла для вызова, чтобы открыть?)
  • также может быть, что вы не ждете, пока данные будут сброшены: если вы печатаете на терминале, данные сброшены после каждой новой строки, но если вы печатаете в файл, он сбрасывается только тогда, когда буфер stdout заполнен (4096 байт в большинстве систем).

Я хочу перенаправить печать в файл .txt с помощью python. У меня есть цикл "for", который будет "печатать" выходные данные для каждого из моего .bam файла, в то время как я хочу перенаправить ВСЕ эти выходные данные в один файл. Поэтому я попытался поставить

в начале моего script. Однако я ничего не получаю в TXT файле. Мой script:

Так в чем проблема? Любой другой способ, кроме этого sys.stdout?

Мне нужен мой результат:

10 ответов

169 Решение Gringo Suave [2011-08-22 23:00:00]

Наиболее очевидный способ сделать это — напечатать на объект файла:

Тем не менее, перенаправление stdout также работает для меня. Это, вероятно, хорошо для одноразового сценария, такого как этот:

Какое первое имя файла в вашем сценарии? Я не вижу его инициализированным.

Мое первое предположение состоит в том, что glob не находит никаких bamfiles, и поэтому цикл for не запускается. Убедитесь, что папка существует, и распечатайте bamfiles в вашем скрипте.

Также используйте os.path.join и os.path.basename для манипулирования путями и именами файлов.

52 agf [2011-08-22 22:56:00]

Вы можете перенаправить печать с помощью оператора >> .

В большинстве случаев лучше просто записать в файл нормально.

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

Читайте также:  Windows 2016 iscsi target

28 Yeo [2016-07-04 16:45:00]

print(*objects, sep=’ ‘, end=’
‘, file=sys.stdout, flush=False)

Аргумент файла должен быть объектом с методом write(string) ; если он отсутствует или None , будет использоваться sys.stdout . Поскольку напечатанные аргументы преобразуются в текстовые строки, print() не может использоваться с объектами файла двоичного режима. Для этого используйте file.write(. ) .

Так как файловый объект обычно содержит метод write() , все, что вам нужно сделать, это передать файл file в свой аргумент.

Это отлично работает:

Теперь приветствие будет записано в файл test.txt. Обязательно закройте stdout с помощью close , без этого содержимое не будет сохранено в файле

Самое простое решение — не через python; его через оболочку. Из первой строки вашего файла ( #!/usr/bin/python ) я предполагаю, что вы находитесь в системе UNIX. Просто используйте операторы print , как обычно, и не открывайте файл вообще в script. Когда вы запустите файл, вместо

чтобы запустить файл, используйте

где вы заменяете именем файла, к которому вы хотите получить выход. Ток > сообщает (большинству) оболочек для установки stdout в файл, описываемый следующим токеном.

Важно отметить, что "script.py" нужно сделать исполняемым для ./script.py для запуска.

Итак, перед запуском ./script.py выполните эту команду

chmod a+x script.py (сделайте исполняемый файл script для всех пользователей)

8 jpyams [2018-01-01 23:54:00]

Не используйте print , используйте logging

Вы можете изменить sys.stdout чтобы он указывал на файл, но это довольно неуклюжий и негибкий способ решения этой проблемы. Вместо использования print , используйте модуль logging .

При logging вы можете печатать так же, как в stdout , или вы также можете записать вывод в файл. Вы даже можете использовать различные уровни сообщений ( critical , error , warning , info , debug ), чтобы, например, печатать только основные проблемы на консоли, но при этом регистрировать второстепенные действия кода в файле.

Простой пример

Импортируйте logging , получите logger и установите уровень обработки:

Если вы хотите распечатать на стандартный вывод:

Если вы также хотите записать в файл (если вы хотите записать только в файл, пропустите последний раздел):

Затем, где бы вы ни использовали print используйте один из методов logger :

Чтобы узнать больше об использовании более продвинутых функций logging , прочитайте превосходное руководство по ведению logging в документации по Python.

Вам может не понравиться этот ответ, но я думаю, что это ПРАВЫЙ. Не изменяйте назначение stdout, если это абсолютно необходимо (возможно, вы используете библиотеку, которая выводит только на stdout, явно не так).

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

И затем, когда вы все сделаете сбор ваших "строк данных" по одной строке в элементе списка, вы можете присоединиться к ним с некоторыми символами ‘
‘ , чтобы сделать все выводное; возможно, даже заверните оператор вывода в блок with для дополнительной безопасности (автоматически закроет дескриптор вывода, даже если что-то пойдет не так):

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

Читайте также:  Как правильно читать резисторы

0 Jerome [2011-08-22 23:05:00]

Изменение значения sys.stdout изменяет назначение всех вызовов для печати. Если вы используете альтернативный способ изменения адресата печати, вы получите тот же результат.

Ваша ошибка в другом месте:

  • это может быть в коде, который вы удалили для своего вопроса (откуда появляется имя файла для вызова?)
  • также может быть, что вы не ожидаете сброса данных: если вы печатаете на терминале, данные размываются после каждой новой строки, но если вы печатаете в файл, он только краснеет, когда буфер stdout заполняется (4096 байт в большинстве систем).

Помогите разобраться с перенаправлением вывода cmd в переменную, т.к. переменной присваивается только exit_code процесса. Для наглядности есть пара примеров:
Пример

Вопрос: можно ли перенаправить вывод терминала windows не используя temp.txt файл, тобиш сразу выгружать значение в переменную.? sys.stdout пробовал.

3 Answers

Самый простой способ перенаправить вывод из системной оболочки — это подключиться к каналу команды, вот таким образом:

Здесь мы открыли канал и получили объект открытого файла из которого можно читать или писать в него в зависимости от режима ( r по умолчанию) открытия, используя стандартный интерфейс работы с файлами.

При накоплении целой кучи батников, для записи разных стримов, пришла в голову идея, автоматизировать процесс контроля за работой этих батников. Скрипт, который будет контролировать запуск и перезапуск в случае краша, мониторинг работоспособности, добавления новых стримов и оповещать в случае изменений, либо ошибок в любом из батников. Теперь собственно для чего был задан вопрос. ffmpeg иногда ругается на прямые ссылки на стримы, поэтому предварительно их нужно обрабатывать с помощью youtube-dl. Можно конечно писать все стримы youtube-dl, а потом разбивать готовые файлы на части, но они будут недоступны для просмотра во время записи.

UPD. Это кусочек тестового примера, через subprocess . Пример с os.popen , также работает. Но я решил уйти от батников, буду пытаться запустить несколько потоков. Удачи мне, вам всем огромнейшая благодарность )))

subprocess.check_output()
— это самый простой способ получить вывод внешней команды:

Всё что программа выводит в стандартный вывод, сохраняется в output . Если программа завершится с ненулевым статусом возврата (как правило на ошибку указывает), то check_output() выбросит исключение (не следует неявно ошибки игнорировать).

Начиная с простого случая существует множество вариаций. К примеру, чтобы получить объединённый вывод как из стандартного потока команды (stdout) так и из потока ошибок (stderr), можно передать stderr=subprocess.STDOUT параметр в check_output() . Дочерний процесс может вообще напрямую в терминал писать в обход своих stdout/stderr, в этом случае на POSIX системах можно pty создать, чтобы перехватить вывод (в таких случаях удобно pexpect модуль использовать).

По умолчанию вывод возвращается в виде байт, чтобы получить текст необходимо указать кодировку символов, которая может зависеть от выбранной команды:

Стоит упомянуть, что в отличии от старых интерфейсов, унаследованных из Си (таких как system() , popen() ), функции в subprocess модуле никогда не запускают командную оболочку, если явно об этом не попросить. Что позволяет избежать shell injection и делает вызов более переносимым (если сама программа переносима).

Ссылка на основную публикацию
Adblock detector