Я хочу перенаправить вывод в файл .txt с помощью Python. У меня есть for цикл, который будет print выводить данные для каждого моего файла .bam, в то время как я хочу перенаправить все выходные данные в один файл. Итак, я попытался поместить:
f = open('output.txt','w') sys.stdout = f
в начале моего скрипта. Однако я ничего не получаю в файле .txt. Мой скрипт:
#!/usr/bin/python
import os,sys import subprocess import glob from os import path
withopen('out.txt', 'w') as f: with redirect_stdout(f): print('data')
Перенаправление извне из самой оболочки - еще один вариант, и часто предпочтительнее:
./script.py > out.txt
Другие вопросы:
Какое первое имя файла в вашем скрипте? Я не вижу, чтобы оно было инициализировано.
Мое первое предположение заключается в том, что glob не находит никаких bamfiles, и поэтому цикл for не запускается. Проверьте, существует ли папка, и распечатайте bamfiles в вашем скрипте.
Аргумент file должен быть объектом с write(string) методом; если он отсутствует или None, sys.stdout будет использоваться. Поскольку напечатанные аргументы преобразуются в текстовые строки, print() их нельзя использовать с файловыми объектами в двоичном режиме. Вместо этого используйте file.write(...).
Поскольку файловый объект обычно содержит write() метод, все, что вам нужно сделать, это передать файловый объект в его аргумент.
Запись / Перезапись в файл
withopen('file.txt', 'w') as f: print('hello world', file=f)
Запись / добавление в файл
withopen('file.txt', 'a') as f: print('hello world', file=f)
Ответ 4
Не используйте print, используйте logging
Вы можете изменить sys.stdout, чтобы указать на файл, но это довольно неуклюжий и негибкий способ решения этой проблемы. Вместо использования printиспользуйте logging модуль .
С помощью logging вы можете печатать так же, как и в stdout, или вы также можете записать выходные данные в файл. Вы даже можете использовать другое сообщение уровней (critical, error, warning, info, debug), чтобы, например, печатать только основные вопросы, на консоль, но все равно войти незначительные код действия в файл.
Простой пример
Импортируйте logging, получите logger и установите уровень обработки:
import logging logger = logging.getLogger() logger.setLevel(logging.DEBUG) # process everything, even if everything isn't printed
Если вы хотите выполнить печать в стандартный вывод:
ch = logging.StreamHandler() ch.setLevel(logging.INFO) # or any other level logger.addHandler(ch)
Если вы хотите также выполнять запись в файл (если вы хотите выполнять запись только в файл, пропустите последний раздел):
fh = logging.FileHandler('myLog.log') fh.setLevel(logging.DEBUG) # or any level you want logger.addHandler(fh)
Затем, где бы вы ни использовали, print используйте один из logger методов: