2016-09-26 1 views
0

. 내가 파이썬에서 초심자를 그리고 난 할 사투를 벌인거야 다음Python - 라인에서 문자를 구분하는 파일 비교.

EgrG_000095700 /product="ubiquitin carboxyl terminal hydrolase 5" 
EgrG_000095800 /product="DNA polymerase epsilon subunit 3" 
EgrG_000095850 /product="crossover junction endonuclease EME1" 
EgrG_000095900 /product="lysine specific histone demethylase 1A" 
EgrG_000096000 /product="charged multivesicular body protein 6" 
EgrG_000096100 /product="NADH ubiquinone oxidoreductase subunit 10" 

이 하나 (600 선) :

나는이 (+ 10,000 선)과 같은 파일이 있습니다 :

EgrG_000076200.1 
EgrG_000131300.1 
EgrG_000524000.1 
EgrG_000733100.1 
EgrG_000781600.1 
EgrG_000094950.1 

두 번째 파일의 모든 ID가 첫 번째 파일에 있으므로 첫 번째 파일의 ID가 두 번째 파일의 ID와 일치해야합니다.

나는 다음과 같은 스크립트를 작성 : 내 생각은 새 파일에 라인을 작성, 아이디의이 후, 다른 하나 개의 파일의 EgrG_XXXX 일치하도록 각 행에 문자를 구분 검색하는 것이 었습니다
f1 = open('egranulosus_v3_2014_05_27.tsv').readlines() 
f2 = open('eg_es_final_ids').readlines() 
fr = open('res.tsv','w') 

for line in f1: 
    if line[0:14] == f2[0:14]: 
     fr.write('%s'%(line)) 

fr.close() 
print "Done!" 

. 나는 약간의 수정을 시도했다, 그것은 나의 아이디어의 "핵심"이다. 나는 아무것도 얻지 못했다. 수정 중 하나에서 나는 한 줄을 얻었다.

+0

두 번째 파일의 줄은 항상'.1'로 끝 맺습니까? – albert

+0

그래서'egranulosus_v3_2014_05_27.tsv'의 내용을'eg_es_final_ids'의 순서로 정렬하고 있습니까? – roganjosh

+0

예, 두 번째 파일의 모든 행은 .1로 끝납니다. –

답변

0
with open('egranulosus_v3_2014_05_27.txt', 'r') as infile: 
    line_storage = {} 
    for line in infile: 
     data = line.split() 
     key = data[0] 
     value = line.replace('\n', '') 
     line_storage[key] = value 

with open('eg_es_final_ids.txt', 'r') as infile, open('my_output.txt', 'w') as outfile: 
    for line in infile: 
     lookup_key = line.split('.')[0] 
     match = line_storage.get(lookup_key) 
     outfile.write(''.join([str(match), '\n'])) 
+0

''None''을' 일치하는 경우' – roganjosh

+0

그게 효과가있어, 친구! 많은 감사합니다! 유일한 "문제"는 출력 선이 시작과 끝에서 대괄호로 표시되지만 쉽게 제거 할 수 있다는 것입니다. :) –

+0

@TiagoMinuzzi 가장 환영합니다.'str (match)'를 단지'match'로 변경하고 그것이 지속되는지 알려주세요. – roganjosh

4

f2의 ID를 세트에 저장 한 다음 f1을 확인하십시오.

id_set = set() 
with open('eg_es_final_ids') as f2: 
    for line in f2: 
     id_set.add(line[:-2]) #get rid of the .1 

with open('egranulosus_v3_2014_05_27.tsv') as f1: 
    with open('res.tsv', 'w') as fr: 
     for line in f1: 
      if line[:14] in id_set: 
       fr.write(line) 
+0

이것은 다른 파일에 존재 하는지를 검사 만하고, 작동하지 않는'eg_es_final_ids' – roganjosh

+0

의 쓰기 순서를 유지하지 않습니다. 예를 들어, "EgrG_000095700/product ="ubiquitin carboxyl terminal hydrolase 5 "를"EgrG_000095700 "과 비교하여 두 번째 이유는"/ product "가 부족하다는 것입니다. .. ", 파이썬은 wrting되지 않습니다. 그 이유는 문자를 구분하여 줄을 복사하고 싶습니다. –

+0

위의'line [: 14]'을'line.split() [0] .strip()'으로 대체 해보십시오. –

0

f2는 파일 -2의 행 목록입니다. 파일 1 (f1)의 행에 대해 수행하는 것처럼 목록을 반복합니다. 그게 문제 인 것 같습니다.

관련 문제