Как создать набор данных, используя файл последовательности в python

У меня файл последовательности белка выглядит так:

>102L:A       MNIFEMLRIDEGLRLKIYKDTEGYYTIGIGHLLTKSPSLNAAAKSELDKAIGRNTNGVITKDEAEKLFNQDVDAAVRGILRNAKLKPVYDSLDAVRRAALINMVFQMGETGVAGFTNSLRMLQQKRWDEAAVNLAKSRWYNQTPNRAKRVITTFRTGTWDAYKNL       -------------------------------------------------------------------------------------------------------------------------------------------------------------------XX

Первый — название последовательности, второй — фактическая последовательность белка, а первый — индикатор, показывающий, есть ли пропущенные координаты. В этом случае обратите внимание, что в конце есть два «X». Это означает, что последние два остатка последовательности являются «NL», в этом случае отсутствуют координаты.

Кодируя в Python, я хотел бы создать таблицу, которая должна выглядеть так:

  1. название последовательности
  2. общее количество отсутствующих координат (которое является числом X)
  3. диапазон этих отсутствующих координат (который является диапазоном положения этих X) 4) длина последовательности 5) фактическая последовательность

Таким образом, окончательные результаты должны выглядеть так:

>102L:A 2 163-164 164 MNIFEMLRIDEGLRLKIYKDTEGYYTIGIGHLLTKSPSLNAAAKSELDKAIGRNTNGVITKDEAEKLFNQDVDAAVRGILRNAKLKPVYDSLDAVRRAALINMVFQMGETGVAGFTNSLRMLQQKRWDEAAVNLAKSRWYNQTPNRAKRVITTFRTGTWDAYKNL

И мой код пока выглядит так:

total_seq = []
with open('sample.txt') as lines:
    for l in lines:
        split_list = l.split()

        # Assign the list number
        header = split_list[0]                                # 1
        seq = split_list[1]                                   # 5
        disorder = split_list[2]

        # count sequence length and total residue of missing coordinates
        sequence_length = len(seq)                            # 4

        for x in disorder:
            counts = 0
            if x == 'X':
                counts = counts + 1

        total_seq.append([header, seq, str(counts)])   # obviously I haven't finish coding 2 & 3

with open('new_sample.txt', 'a') as f:
    for lol in total_seq:
        f.write('\n'.join(lol))

Я новичок в питоне, кто-нибудь может помочь?


person Jlod888    schedule 11.07.2014    source источник
comment
В чем именно заключается ваш вопрос?   -  person jonrsharpe    schedule 11.07.2014
comment
Вы делаете это, чтобы создать таблицу, которую вы можете загрузить в R? Почему вы не можете загрузить последовательности в R? Ознакомьтесь с пакетом SeqinR.   -  person wflynny    schedule 11.07.2014
comment
@jonrsharpe Мой вопрос заключается в том, как создать файл, похожий на мои окончательные результаты, используя файл последовательности, который у меня есть в первую очередь. Извините за путаницу.   -  person Jlod888    schedule 11.07.2014
comment
@Bill Не обязательно загружать в R. Я просто хочу создать файл, похожий на мои окончательные результаты. Извините за путаницу.   -  person Jlod888    schedule 11.07.2014
comment
@ Jlod888 ответ - написать код; этот вопрос слишком широк для SO   -  person jonrsharpe    schedule 11.07.2014


Ответы (1)


Вот ваш модифицированный код. Теперь он производит желаемый результат.

with open("sample.txt") as infile:
    matrix  = [line.split() for line in infile.readlines()]

    header_list  = [row[0] for row in matrix]
    seq_list = [str(row[1]) for row in matrix]
    disorder_list = [str(row[2]) for row in matrix]

f = open('new_sample.txt', 'a')

for i in range(len(header_list)):
    header = header_list[i]
    seq = seq_list[i]
    disorder = disorder_list[i]

    # count sequence length and total residue of missing coordinates
    sequence_length = len(seq)                            

    # get total number of missing coordinates
    num_missing = disorder.count('X')             

    # get the range of these missing coordinates
    first_X_pos = disorder.find('X')
    last_X_pos = disorder.rfind('X')
    range_missing = '-'.join([str(first_X_pos), str(last_X_pos)])

    reformat_seq=" ".join([header, str(num_missing), range_missing, str(sequence_length), seq, '\n'])  
    f.write(reformat_seq)

f.close()

Еще несколько советов:

Не забывайте о строковых функциях Python. Они решат многие ваши проблемы автоматически. документация очень хороша.

Если вы искали, как сделать только часть 2 или только часть 3 в своем вопросе, вы найдете результаты в другом месте.

person hbuchman    schedule 11.07.2014
comment
Большое спасибо! Я очень ценю вашу помощь! - person Jlod888; 11.07.2014
comment
Еще раз спасибо. Но у меня есть другой вопрос. Ваш код отлично работает только с одним отсутствующим сегментом координат. Так в примере, который я привел выше. Не хватает только одного сегмента координат, который находится в двух последних позициях. Но что, если есть несколько сегментов? например: --------XXXXX------XX-----X - person Jlod888; 11.07.2014
comment
Счет все еще должен быть в порядке. Как бы вы хотели отформатировать диапазон в этом случае? Есть несколько советов по получению всех индексов, где x появляется здесь: stackoverflow.com/questions/13009675/ - person hbuchman; 12.07.2014
comment
Спасибо еще раз! Итак, в вашем коде диапазон этого -----XX будет 5-6 (потому что он начинается с 0). Но используя ваш код, ярость -XX--XX будет 1-6. Но я бы хотел, чтобы в этом случае диапазон отображался как 1-2, 5-6. Извините, что беспокою вас снова! - person Jlod888; 12.07.2014