2017-11-16 17 views
0

텍스트 파일의 특정 줄을 사용하여 사전을 만들고 싶습니다. 여기 내 TEXTFILE에서 예는 (각각 '페이지'// '로 분리된다)텍스트 파일에서 특정 줄을 검색하고이를 사용하여 사전을 만듭니다.

// 
UNIQUE-ID - INDOLE-3-ACETYL-BETA-4-D-GLUCOSE 
TYPES - Compounds 
COMMON-NAME - 4-<i>O</i>-(indol-3-ylacetyl)-&beta;-D-glucose 
DBLINKS - (HMDB "HMDB12213" NIL |kothari| 3594494404 NIL NIL) 
INCHI - InChI=1S/C16H19NO7/c18-7-11-15(13(20)14(21)16(22)23-11)24-12(19)5-8-6-17-10-4-2-1-3-9(8)10/h1-4,6,11,13-18,20-22H,5,7H2/t11-,13-,14-,15-,16-/m1/s1 
SMILES - C(C3(C(OC(=O)CC1(=CNC2(C=CC=CC1=2)))C(O)C(O)C(O)O3))O 
SYNONYMS - indole-3-acetyl-&beta;-4-D-glucose 
// 
UNIQUE-ID - CPD-6783 
TYPES - Myo-inositol-bisphosphates 
COMMON-NAME - D-<i>myo</i>-inositol (2,4) bisphosphate 
DBLINKS - (HMDB "HMDB03905" NIL |kothari| 3608597114 NIL NIL) 
DBLINKS - (PUBCHEM "25245743" NIL |taltman| 3466375284 NIL NIL) 
INCHI - InChI=1S/C6H14O12P2/c7-1-2(8)5(17-19(11,12)13)4(10)6(3(1)9)18-20(14,15)16/h1-10H,(H2,11,12,13)(H2,14,15,16)/p-4/t1-,2-,3+,4-,5-,6-/m0/s1 
// 

가 사전로 시작하는 라인이 있어야'INCHI - InChI를 = '키와'DBLINKS을 containg 광고로서 - (HMDB '. 여기에 값 그리고 내 코드입니다 :

나에게 오류 unhashable 유형 제공
data = open('compounds.dat', 'r', errors = 'ignore') 
compounds = data.readlines() 

INCHI_list = [] 
HMDB_list = [] 
dict_Inchi_HMDB = dict() 

for i,line in enumerate(compounds): 
    if 'INCHI - InChI=' in line: 
     INCHI_list.append(line) 

    if 'DBLINKS - (HMDB' in line: 
     HMDB_list.append(line) 
dict_Inchi_HMDB[INCHI_list] = HMDB_list 

'목록 '나는 오류가 발생하지만 난 더 나은 함께 올 수 않네 왜 이해를. 접근 ... 누군가 도울 수 있습니까?

참고 : 'DBLINKS - (HMDB'는 항상 INCHI-InCh I = '이지만 줄 사이의 수는 다를 수 있습니다. 또한 데이터 파일에는 몇 백 개의 예제가 들어 있습니다. 각 '페이지'에 존재하지

+0

당신이 개 목록은 당신이'dict_Inchi_HMDB = DICT (우편 (INCHI_list, HMDB_list))'작동 –

답변

1
result = {} 
with open('compounds.dat', errors = 'ignore') as my_file: # Using with open one does not need to run my_file.close() after, that is taken care of for you. 
    for page in my_file.read().split('//'): # Since each page is delimited by // lets split on that and create a list of pages. 
     for line in reversed(page.split('\n')): # Split on every newline and reverse the list so the INCHI line comes up first, we'll use it as the key. 
      k, v = line.split(' - ') # if line is e.g. UNIQUE-ID - CPD-6783, this creates k = 'UNIQUE-ID', v = 'CPD-6783' 
      if 'INCHI - ' in line: # We found our key line. 
       curr_k = v # Let's remember the key so that when we hit the DBLINKS - (HMDB line, we can assign the value to the correct key. 
      elif 'DBLINKS - (HMDB' in line: # We found our value line 
       result[curr_k] = v # We found the value and we remember what key to assign it to (curr_k) 
+0

감사를 사용하여 정렬하는 경우 - 그리고 라인 '(HMDB DBLINKS'! 사전에 키와 값을 할당하는 방법을 설명하기 위해 스크립트에 몇 가지 설명을 추가 할 수 있습니까? – StudentOIST

+0

확실한 것입니다. 나중에 올바른 답으로 표시 할 것을 고려하십시오. – alexisdevarennes

+0

도움이되기를 바랍니다. – alexisdevarennes