[python] 파이썬을 사용하여 ‘인쇄’출력을 파일로 리디렉션하는 방법은 무엇입니까?

파이썬을 사용하여 인쇄를 .txt 파일로 리디렉션하고 싶습니다. ‘for’루프가 있는데,이 출력을 모두 하나의 파일로 리디렉션하고 싶을 때 각 .bam 파일의 출력을 ‘인쇄’합니다. 그래서 넣어 보았습니다

 f = open('output.txt','w'); sys.stdout = f

내 스크립트의 시작 부분에. 그러나 .txt 파일에는 아무것도 없습니다. 내 스크립트는 다음과 같습니다

#!/usr/bin/python

import os,sys
import subprocess
import glob
from os import path

f = open('output.txt','w')
sys.stdout = f

path= '/home/xug/nearline/bamfiles'
bamfiles = glob.glob(path + '/*.bam')

for bamfile in bamfiles:
    filename = bamfile.split('/')[-1]
    print 'Filename:', filename
    samtoolsin = subprocess.Popen(["/share/bin/samtools/samtools","view",bamfile],
                                  stdout=subprocess.PIPE,bufsize=1)
    linelist= samtoolsin.stdout.readlines()
    print 'Readlines finished!'
    ........print....
    ........print....

그래서 무엇이 문제입니까? 이 sys.stdout 외에 다른 방법이 있습니까?

내 결과는 다음과 같아야합니다.

Filename: ERR001268.bam
Readlines finished!
Mean: 233
SD: 10
Interval is: (213, 252)



답변

이를 수행하는 가장 확실한 방법은 파일 객체로 인쇄하는 것입니다.

with open('out.txt', 'w') as f:
    print >> f, 'Filename:', filename     # Python 2.x
    print('Filename:', filename, file=f)  # Python 3.x

그러나 stdout을 리디렉션하면 효과가 있습니다. 다음과 같은 일회성 스크립트에 적합합니다.

import sys

orig_stdout = sys.stdout
f = open('out.txt', 'w')
sys.stdout = f

for i in range(2):
    print 'i = ', i

sys.stdout = orig_stdout
f.close()

쉘 자체에서 외부로 리디렉션하는 것도 좋은 방법입니다.

./script.py > out.txt

다른 질문:

스크립트에서 첫 번째 파일 이름은 무엇입니까? 초기화되지 않았습니다.

내 첫 번째 추측은 glob이 bamfile을 찾지 못하므로 for 루프가 실행되지 않는다는 것입니다. 폴더가 있는지 확인하고 스크립트에서 bamfile을 인쇄하십시오.

또한 os.path.join 및 os.path.basename 을 사용하여 경로 및 파일 이름을 조작하십시오.


답변

>>운영자 와 함께 인쇄를 재 지정할 수 있습니다 .

f = open(filename,'w')
print >>f, 'whatever'     # Python 2.x
print('whatever', file=f) # Python 3.x

대부분의 경우 파일에 정상적으로 쓰는 것이 좋습니다.

f.write('whatever')

또는 여러 항목이있는 경우 다음과 같이 공백으로 쓰십시오 print.

f.write(' '.join(('whatever', str(var2), 'etc')))


답변

Python 2 또는 Python 3 API 참조 :

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

파일 인수는 가진 객체 여야 write(string)방법; 그것이없는 경우, 또는 None, sys.stdout이용 될 것이다. 인쇄 된 인수는 텍스트 문자열로 변환되므로 print()이진 모드 파일 객체와 함께 사용할 수 없습니다. 이를 위해 file.write(...)대신 사용하십시오.

이후 파일 객체가 정상적으로 포함 write()방법을, 당신이 할 필요가 전달하는 파일 객체를 인수로.

파일 쓰기 / 덮어 쓰기

with open('file.txt', 'w') as f:
    print('hello world', file=f)

파일에 쓰기 / 추가

with open('file.txt', 'a') as f:
    print('hello world', file=f)


답변

이것은 완벽하게 작동합니다.

import sys
sys.stdout=open("test.txt","w")
print ("hello")
sys.stdout.close()

이제 hello가 test.txt 파일에 작성됩니다. 를 닫 확인 stdout로모그래퍼 close파일에 저장되지 않습니다없이, 컨텐츠를


답변

사용하지 마십시오 print, 사용logging

sys.stdout파일을 가리 키도록 변경할 수는 있지만,이 문제를 처리하는 것은 매우 어수선하고 유연하지 않은 방법입니다. 을 사용하는 대신 모듈을 print사용하십시오 logging.

을 사용 logging하여 원하는대로 인쇄 stdout하거나 출력을 파일에 쓸 수도 있습니다. 당신은 (다른 메시지 수준을 사용할 수 있습니다 critical, error, warning, info, debug), 예를 들어, 콘솔 만에 주요 이슈를 인쇄 할 수 있지만, 여전히 파일에 마이너 코드의 작업을 기록합니다.

간단한 예

Import를 가져 logging와서 logger처리 레벨을 설정하십시오.

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG) # process everything, even if everything isn't printed

stdout으로 인쇄하려면 다음을 수행하십시오.

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.

# print(foo)
logger.debug(foo)

# print('finishing processing')
logger.info('finishing processing')

# print('Something may be wrong')
logger.warning('Something may be wrong')

# print('Something is going really bad')
logger.error('Something is going really bad')

더 많은 고급 logging기능을 사용하는 방법에 대한 자세한 내용은 loggingPython 문서에서 훌륭한 자습서를 읽으십시오 .


답변

가장 쉬운 해결책은 파이썬을 통한 것이 아닙니다. 껍질을 통해. 파일의 첫 번째 줄 ( #!/usr/bin/python)에서 유닉스 시스템을 사용하고 있다고 생각합니다. print평소처럼 문장을 사용 하고 스크립트에서 파일을 전혀 열지 마십시오. 파일을 실행할 때 대신

./script.py

파일을 실행하려면

./script.py > <filename>

여기서 <filename>출력을 넣을 파일 이름으로 바꿉니다. >토큰은 다음과 같은 토큰에 의해 기술 된 파일에 설정된 표준 출력으로 (대부분의) 껍질을 알려줍니다.

여기서 언급해야 할 중요한 사항 중 하나는 “script.py”를 실행하기 ./script.py위해 실행 가능해야한다는 것 입니다.

따라서 실행하기 전에이 ./script.py명령을 실행하십시오.

chmod a+x script.py
(모든 사용자가 스크립트를 실행 가능하게하십시오)


답변

Linux를 사용하는 경우 tee명령 을 사용하는 것이 좋습니다 . 구현은 다음과 같습니다.

python python_file.py | tee any_file_name.txt

코드에서 아무것도 바꾸고 싶지 않다면 이것이 최선의 해결책이라고 생각합니다. 로거를 구현할 수도 있지만 코드를 약간 변경해야합니다.