2014-10-22 2 views
1

많은 사람들이 버퍼와 stdin을 얻는 데 어려움을 겪고 있으며 많은 Python을 사용하고 있습니다. Python 2.7.6에서 stdin을 읽고, 정규식 매치를 수행하고, 일치하는 문자열 목록을 출력하는 스크립트를 작성하고 있습니다. 저를 발견하기 전에 아무것도 인쇄하여 stdin에서 EOF 블록을 읽고 난 그게에서 읽는 프로세스 실행/인쇄를하는 방법에 대한 문서를 찾을 수없는 것까지 많은처럼 Python 2.7.6에서 stdin에서 읽기. Sys.stdout.flush()와 python -u가 작동하지 않습니다.

import re, sys 

barcodes=["The barcodes are:"] 
curr=barcodes[0] 

#iterate through stdin 
for line in sys.stdin.readlines(): 
     #do regex match in line 
     match = re.search('(?<=\:)[GATC]{6}', line.rstrip()).group(0) 
     matched = 0 
     #see if match has been seen before 
     if (match == curr): 
       matched = 1 
       print "matched curr" 
     else: 
       for a , val in enumerate(barcodes): 
         if (match == val): 
           print str(a) + " : " + val + " barcodes[a] " + str(barcodes[a]) 
           curr = barcodes[a] 
           print curr 
           matched = 1 
           print "matched iteration" 
     #if match hasn't been seen before 
     if (matched == 0): 
       sys.stdout.write("NEW match") 
       sys.stdout.flush() 
       barcodes.append(match) 

#print report of barcodes 
for i in barcodes: 
     print i 

이 기다립니다 stdin.

파이썬을 -u 플래그로 호출하는지 여부에 관계없이이 문제는 발생합니다.

안내해 주셔서 감사합니다.

+1

'.readlines()'는 전체 파일 (또는 stdin)을 한 번에 읽습니다.'.read()'를 사용하고 직접 개행을 찾아야합니다. – thebjorn

+0

용서해주세요. 그러나 파일 객체에 대한 문서를 읽었으며, 줄 바꿈을 사용하여 sys.stdin.read()가 반환 할 문자열을 반복하는 방법이 나에게 불분명합니다. 설정된 바이트 수를 사용하여 stdin에서 읽으려고하면 문자열을 목록으로 구문 분석 한 다음 전체 파일을 읽을 때까지 각 목록을 반복합니다. –

+0

@ DanBurkhardt : 간단히'for line in sys.stdin :'시도해 보셨습니까? –

답변

1

다음은 sys.stdin을 한 번에 한 줄씩 읽는 몇 가지 예제입니다. 그들은 이 아니며은 파이썬 -u 옵션을 사용해야합니다.

#! /usr/bin/env python 

import sys 

def main(): 
    count = 1 
    while True: 
     line = sys.stdin.readline() 
     if line == '': 
      break #EOF encountered 

     print "%3d: [%s]" % (count, line[:-1]) 
     count += 1 


if __name__ == '__main__': 
    main() 

Linux/Unix를 사용하는 경우이 버전이 사용자에게 줄 편집 기능을 제공하므로 더 좋습니다.

#! /usr/bin/env python 

import sys 
import readline 

def main(): 
    count = 1 
    while True: 
     try: 
      line = raw_input() 
      print "%3d: [%s]" % (count, line) 
      count += 1 
     except EOFError: 
      break 


if __name__ == '__main__': 
    main() 
+0

고맙습니다. 이전에 비슷한 솔루션을 보았지만 while True 루프를 사용해야하는 것은 미친 것처럼 보였습니다. 그것을 피할 수있는 방법이 있기를 바랬지 만 최종 코드에서 블록을 제외하고 시도해 보았습니다. –

+0

'stdin'이 특별하기 때문에 그런 것 같아요. 당신은'for line in sys.stdin :'을 사용할 수 있습니다. 그러나 모든 라인의 끝 부분에 EOF를 보내야합니다. 이것은 조금 짜증납니다. :) –

1

sys.stdin 그냥 file 객체 당신이 모든 라인을 읽을 때까지 계속 읽기 readlines()를 사용하는 경우 너무. 이는 Ctrl + D를 누른 경우에만 발생합니다 (Linux의 경우). 이런 식으로 읽는 대신 라인으로 라인, 뭔가를보십시오 :

#!/usr/bin/env python 
import sys,re 


while True: 

    line = sys.stdin.readline() 
    m = re.search("end", line) 
    if m: 
     break 
    else: 
     print "I read:" + line 
+0

그래서 stdin의 끝 부분에는 EOF에 문자 그대로 "끝"이 있습니까? 그 문자열에 대한 re.search가 작동 할 것이라고 기대하지 않았습니다. –

+0

"end"는 내 예입니다. stdin의 끝을 감지하는 코드를 작성해야합니다. 요구 사항에 따라 stdin의 끝을 나타낼 수 있습니다. 일부 입력 문자열이나 CTRL + D를 눌렀습니다. – abc

0

을이 솔루션은 단순히 이것이다 : sys.stdin 이후

for line in sys.stdin: 
    # process line 

그것이 시간과에 선 하나를 생성하는 반복, 파일 - 류의 객체이다 그들은 이용 가능하게된다.

관련 문제