파이썬을 사용하여 인쇄를 .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')))
답변
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
기능을 사용하는 방법에 대한 자세한 내용은 logging
Python 문서에서 훌륭한 자습서를 읽으십시오 .
답변
가장 쉬운 해결책은 파이썬을 통한 것이 아닙니다. 껍질을 통해. 파일의 첫 번째 줄 ( #!/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
코드에서 아무것도 바꾸고 싶지 않다면 이것이 최선의 해결책이라고 생각합니다. 로거를 구현할 수도 있지만 코드를 약간 변경해야합니다.