2013-11-07 6 views
1

У меня есть два файла. 1-ый файл выглядит примерно так:заменить часть файла другим файлом

'1'  'PS' 'at5g38660'  'Symbols: APE1 | APE1' T 
'1.1' 'PS.lightreaction'  ''  '' 
'1.1.1' 'PS.lightreaction.photosystem II'  ''  '' 
'1.1.1.1'  'PS.lightreaction.photosystem II.LHC-II'  'at1g15820'  'Symbols: LHCB6, ' T 
'1.1.1.1'  'PS.lightreaction.photosystem II.LHC-II'  'at1g29910'  'Symbols: CAB3'  T 
'1.1.1.1'  'PS.lightreaction.photosystem II.LHC-II'  'at1g29920'  'Symbols: CAB2'  T 
'1.1.1.1'  'PS.lightreaction.photosystem II.LHC-II'  'at1g29930'  'Symbols: CAB1'  T 
'1.1.1.1'  'PS.lightreaction.photosystem II.LHC-II'  'at1g76570'  'chlorophyll A-B'  T 
'1.1.1.2'  'PS.lightreaction.photosystem II.PSII'   'at1g03600'  'photosystem II'  T 
'1.1.1.2'  'PS.lightreaction.photosystem II.PSII'  'at1g05385' 'photosystem II 11 kDa' T 
'1.1.1.2'  'PS.lightreaction.photosystem II.PSII'  'at1g06680'  'Symbols: PSBP-1SII-P'  T 

2-й файл:

at5g38660  2356766_1 

at1g15820  3043768_9 

at1g29930  2325825_1 

at1g76570  2921847_3 

at1g03600  2368346_5 

at1g05385  2321872_2 

ожидается выход:

'1'  'PS' '2356766_1'  'Symbols: APE1 | APE1' T 
'1.1' 'PS.lightreaction'  ''  '' 
'1.1.1' 'PS.lightreaction.photosystem II'  ''  '' 
'1.1.1.1 'PS.lightreaction.photosystem II.LHC-II'  '3043768_9'  'Symbols: LHCB6, ' T 
'1.1.1.1'  'PS.lightreaction.photosystem II.LHC-II'  ''  ''  
'1.1.1.1'  'PS.lightreaction.photosystem II.LHC-II'  ''  ''   
'1.1.1.1'  'PS.lightreaction.photosystem II.LHC-II'  '2325825_1'  'Symbols: CAB1'  T 
'1.1.1.1'  'PS.lightreaction.photosystem II.LHC-II'  '2921847_3'  'chlorophyll A-B'  T 
'1.1.1.2'  'PS.lightreaction.photosystem II.PSII'   '2368346_5'  'photosystem II'  T 
'1.1.1.2'  'PS.lightreaction.photosystem II.PSII'  '2321872_2' 'photosystem II 11 kDa' T 
'1.1.1.2'  'PS.lightreaction.photosystem II.PSII'  ''  ''  

здесь я хочу заменить 'at5g38660' 1-го файла с 2356766_1 .. и так далее.

Если есть соответствие, то все столбцы в 1-м файле остаются такими же, кроме третьего (который заменяется значением из второго файла).

Если нет совпадений, то я хочу напечатать первый и второй столбцы 1-го файла, а третий, четвертый и пятый столбцы - как blanl. (Как показано в ожидаемом выходе)

кодирование усталое:

import sys 
ara_red_file = open (sys.argv[1]).readlines() 
ara_map_file  = open (sys.argv[2]).readlines() 
for line in ara_red__file: 
    split_line = line.split('\t') 
    ara_id1 = split_line[0] 
    redbean_id = split_line[1] 
    for lines in ara_map_file: 
     split_line = lines.split('\t') 
     bincode  = split_line[0] 
     name  = split_line[1] 
     ara_id2  = split_line[2] 
     description = split_line[3] 
     code_type = split_line[4] 
      if ara_id2 == ara_id1: 
       print bincode+'\t'+name+'\t'+"'"+redbean_id+"'"+'\t'+description +'\t'+code_type 
      elif ara_id2 != ara_id1: 
       print bincode+'\t'+name+'\t'+ "''" +'\t'+ "''" 

здесь проблему я лицо я не получаю ожидаемый результат .. это dosen't проверить латы, если условие и выводит условие печати последнего Элифа ,

+0

Вы пытаетесь заменить идентификаторы, например, "at5g38660" на "2356766_1"? –

+0

ya Я пытаюсь заменить их и распечатать строки .. если нет совпадения, тогда также мне нужно распечатать строку, за исключением того, что мне не нужно печатать 3-й, 4-й и 5-й столбцы первого файла. – rhkss

ответ

0

Я рекомендую вам сначала создать словарь со вторым файлом и обязательно сохранить его в порядке, а затем создать цикл for, который вы используете, но вы должны убедиться, что вы хорошо сравниваете.

для создания словаря из файла:

dict = {} 
ara_red_file = open (sys.argv[1]).readlines() 
for line in ara_red__file: 
    split_line = line.split('\t') 
    dict[split_line[0]] = split_line[1] 

Таким образом, мы supose словарь заканчивается «как» это:

#####ADDED COMMAS AT THE END OF EACH ELEMENT 
dict = { 
'at5g38660': 12345, 
'at5g386x2': 45678, 
'at5g386x3': 123, 
'at5g386x4': 5555, 
} 

так что теперь вы должны проверить, есть ли ключ в Словаре , как и третий столбец в вашем первом файле:

ara_map_file  = open (sys.argv[2]).readlines()) 
for lines in ara_map_file: 
     split_line = lines.split('\t') 
     bincode  = split_line[0] 
     name  = split_line[1] 
     ara_id2  = split_line[2] 
     description = split_line[3] 
     code_type = split_line[4] 
      if dict.get(ara_id2): #CHANGED HERE @@@@@@@@@@@@@ 
       print bincode+'\t'+name+'\t'+"'"+dict[ara_id2]+"'"+'\t'+description +'\t'+code_type 
      else: 
       print bincode+'\t'+name+'\t'+ "''" +'\t'+ "''" 
+0

i get эта ключевая ошибка: if dict [ara_id2]: KeyError: "'at5g38660'" – rhkss

+0

Вы делаете dict с циклом for или просто копируете мой «пример» dict? Потому что пример dict - это просто пояснить, как в хранилище данных хранится информация, но я не проверял синтаксис. Я не писал запятые после каждого элемента. она должна быть как Dict = { 'at5g38660': 12345, 'at5g386x2': 45678, 'at5g386x3': 123, 'at5g386x4': 5555, } – AlvaroAV

+0

нет я не пытался с моим собственным. Я использовал способ, которым вы попросили меня проверить .. но я получаю ключевую ошибку. – rhkss

Смежные вопросы