2014-01-13 2 views
0

4 개 세트가 들어있는 두 개의 데이터 파일이 있습니다. 두 번째 파일에 포함 된 4 줄 집합을 추출해야합니다 모든 집합의 첫 번째 줄의 일부가 일치하는 경우.python - 일치하는 문자열 다음에 여러 줄을 추출합니다.

다음
input1.txt 
@abcde:134/1 
JDOIJDEJAKJ 
content1 
content2 

input2.txt 
@abcde:134/2 
JKDJFLJSIEF 
content3 
content4 
@abcde:135/2 
KFJKDJFKLDJ 
content5 
content6 

같이 출력이 보일 것입니다 것입니다 : 여기

는 입력 데이터의 예입니다 ...

여기
output.txt 
@abcde:134/2 
JKDJFLJSIEF 
content3 
content4 

이 코드를 작성하려고 시도한은

import sys 

filename1 = sys.argv[1] #input1.txt 
filename2 = sys.argv[2] #input2.txt 

F = open(filename1, 'r') 
R = open(filename2, 'r') 

def output(input1, input2): 
    for line in input1: 
     if "@" in line: 
      for line2 in input2: 
       if line[:-1] in line2: 
        for i in range(4): 
         print next(input2) 

output = output(F, R) 
write(output) 

나는 알아낼 수없는 next() 구문이 잘못되었습니다. 누군가 내 코드를 수정하거나 나에게 줄 수 있다면 기쁠 것입니다. 이 작품을 만드는 방법에 관한 ips.

=== 편집 :== 좋아요, 나는 아래의 의견 (감사합니다)에서 제안 된 솔루션을 구현할 수 있었다고 생각합니다. 나는 이제 원격 우분투 서버에 ssh로 연결된 터미널 세션에서 코드를 실행 중이다. 다음은 코드가 지금 보이는 모습입니다.

filename1 = sys.argv[1] #input file 1 
filename2 = sys.argv[2] #input file 2 (some lines of which will be in the output) 

F = open(filename1, 'r') 
R = open(filename2, 'r') 

def output(input1, input2): 
    for line in input1: 
     input2.seek(0) 
     if "@" in line: 
      for line2 in input2: 
       if line[:-2] in line2: 
        for i in range(4): 
         out = next(input2) 
         print out 
         return 

output (F, R) 

그때 나는이 명령을 실행 (이번에는 내가 python2.7를 실행하고) : 내가 경고를하지 않는

python fetch_reverse.py test1.fq test.fq > test2.fq 

을하지만, 출력 파일이 비어 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+1

python3을 사용하고 있습니까? 이 경우'print'는 함수이며 괄호'print (next (reverse))'가 필요합니다. 이 기능은 python2에서도 작동합니다. – Bakuriu

+1

당신의 함수'output()'는 어떤 것도'return '하지 않는다는 것과 그 이름을 호출 할 때 그 이름을 그려 보려고한다는 것을 알아 두십시오. 또한 결과를 일부 컨테이너에 저장하고 호출자에게 다시 전달한 다음 변수 이름을 변경해야합니다. – jonrsharpe

+0

또 다른주의 사항 :'input1'을 한 번 반복하면서 매치 할 때마다'input2'를 반복하려고합니다. ''@ "in"이 참일 때'input2'를 모두 읽은 다음 파일 끝이 파일 끝 부분에 있으므로 다른 줄을 다시 읽지 않습니다. 당신의 코드는'input1' * first *에서 모든 일치하는'@'줄을 모으고, 대신에 일치하는 것을 검색하는'input2'를 반복 할 필요가 있습니다. –

답변

1

두 번째 파일을 읽지 않고 첫 번째 파일의 읽기를 분할합니다. 매치하고자하는 모든 라인을 모으십시오 (수십만 라인을 읽지 않는 한). 일치하려는 모든 라인을 끝에있는 숫자에서 빼내어 빠른 액세스를 위해 세트에 저장하십시오.

그런 다음 일치하는 라인의 다른 파일을 스캔 :

def output(input1, input2): 
    with input1: # automatically close when done 
     # set comprehension of all lines starting with @, minus last character 
     to_match = {line.strip()[:-1] for line in input1 if line[0] == '@'} 

    with input2: 
     for line in input2: 
      if line[0] == '@' and line.strip()[:-1] in to_match: 
       print line.strip() 
       for i in range(3): 
        print next(input2, '').strip() 

당신은 다음 (이미 읽은 행 번호 1) 다음 행을 읽어도 일치하는 라인을 인쇄 할 필요가있다.

+0

감사합니다. (실제로, 나는 수십만 줄을 읽는다.) – biohazard

+0

@biohazard : 그러면 정말로 * input2 파일을 계속해서 다시 읽고 싶지 않을 것이다. 집합이 메모리에 맞지 않으면 대신 데이터베이스 (예 :'sqlite')를 사용하십시오. –

+0

고마워요! 귀하의 스크립트를 시도했지만 "AttributeError : '파일'개체의 마지막 줄에 'strip'속성이 없습니다. – biohazard

관련 문제