2017-09-30 1 views
1

유전자 뱅크 파일 .gbk에서 특정 유전자를 추출하고 싶습니다. 내 문제는 다음과 같습니다. 파일을 처리하기 위해 각 궤적의 헤더가 특정 형식이어야하며 내 파일에 없습니다. 내가 파일을 구문 분석하고 다음과 같은 헤더를 교체하려면 :파일을 구문 분석하고 파이썬에서 문자열을 수정하십시오.

LOCUS  NODE_1_length_393688_cov_17.8554393688 bp DNA linear 
BCT22-MAY-2017 
DEFINITION Escherichia coli strain strain. 
ACCESSION 
VERSION 
KEYWORDS . 
SOURCE  Escherichia coli 
    ORGANISM Escherichia coli 
      Bacteria; Proteobacteria; gamma subdivision; Enterobacteriaceae; 
      Escherichia. 
.... 
>>Gene data here 
.... 

LOCUS  NODE_2_length_278889_cov_17.85545278889 bp DNA linear 
BCT22-MAY-2017 
DEFINITION Escherichia coli strain strain. 
ACCESSION 
VERSION 
KEYWORDS . 
SOURCE  Escherichia coli 
    ORGANISM Escherichia coli 
      Bacteria; Proteobacteria; gamma subdivision; Enterobacteriaceae; 
      Escherichia. 
.... 
>>Gene data here 
.... 

LOCUS  NODE_3_length_340008_cov_17.855432340008 bp DNA linear 
BCT22-MAY-2017 
DEFINITION Escherichia coli strain strain. 
ACCESSION 
VERSION 
KEYWORDS . 
SOURCE  Escherichia coli 
    ORGANISM Escherichia coli 
      Bacteria; Proteobacteria; gamma subdivision; Enterobacteriaceae; 
      Escherichia. 
.... 
>>Gene data here 
.... 

NODE로 시작되는 문자열은 파일 형식 규칙에 너무 오래이며 그 모양 때문에 교체해야합니다 :

LOCUS  NODE_1_393688 bp DNA linear 
.... 
LOCUS  NODE_2_278889 bp DNA linear 
.... 
LOCUS  NODE_3_340008 bp DNA linear 

잘라내어야 할 부분이 같은 길이 일 필요는 없으므로 문자열의 특정 위치 사이에있는 모든 것을 제거하는 고정 된 방법은 실현 가능하지 않습니다. re.compile()과 r.sub()를 사용하여 다른 접근법을 시도했지만 지금까지 성공하지 못했습니다.

도움을 주시면 감사하겠습니다. 시간 내 주셔서 감사합니다. 첫 번째 라인을 읽을 때

답변

1

, 당신은 필드를 읽을 수 있으며, 다음과 같이 "노드"필드를 정상화 :

import operator 

def normalize_name(name): 
    parts = name.split("_") 
    return "_".join(operator.itemgetter(0, 1, 3)(parts)) 

그것은 부분으로 필드 이름을 분할; 너는 명부를 얻는다. 당신이 얻을

for name in [ 
    "NODE_1_length_393688_cov_17.8554393688", 
    "NODE_2_length_278889_cov_17.85545278889", 
    "NODE_3_length_340008_cov_17.855432340008" 
    ]: 
    print(normalize_name(name)) 

:

NODE_1_393688 
NODE_2_278889 
NODE_3_340008 
그런 다음 부품에 적용되는 operator.itemgetter(0, 1, 3) 기능은, 예를 들어 2

을 건너 뛰는, 인덱스 0, 1, 3에서 항목을 추출합니다

데모

import operator 
import textwrap 


get_parts = operator.itemgetter(0, 1, 3) 


def normalize_name(name): 
    parts = name.split("_") 
    return "_".join(get_parts(parts)) 


def normalize_header(header): 
    fields = header.split() 
    fields[1] = normalize_name(fields[1]) 
    return "{0:<11} {1} {2:<4} {3} {4}".format(*fields) 


content = textwrap.dedent("""\ 
LOCUS  NODE_1_length_393688_cov_17.8554393688 bp DNA linear 
BCT22-MAY-2017 
DEFINITION Escherichia coli strain strain. 
ACCESSION 
VERSION 
KEYWORDS . 
SOURCE  Escherichia coli 
    ORGANISM Escherichia coli 
      Bacteria; Proteobacteria; gamma subdivision; Enterobacteriaceae; 
      Escherichia. 
.... 
>>Gene data here 
.... 
""") 

for line in content.splitlines(): 
    if line.startswith("LOCUS"): 
     line = normalize_header(line) 
    print(line) 
+0

감사합니다. 좋은 소리입니다. 다른 하위 디렉토리의 여러 파일을 구문 분석하고 각 파일에서 'LOCUS'로 시작하는 줄의 모든 인스턴스를 수정하는 루프에이 작업을 구현하기 만하면됩니다. 이를 위해서 필자는 전체 파일 자체에서 읽은'content = textwrap.dedent' 함수에 텍스트를 채워 넣을 필요가 있습니다. 'textwrap.dedent' 할 수 있습니까? – kruemelprinz