2016-06-10 2 views
0

Так что я делаю программу, где он читает текстовый файл, и мне нужно разделить всю информацию на свои собственные переменные. Это выглядит следующим образом:Попытка разделить txt-файл на несколько переменных

>1EK9:A.41,52; B.61,74; C.247,257; D.279,289 
ENLMQVYQQARLSNPELRKSAADRDAAFEKINEARSPLLPQLGLGAD 
YTYSNGYRDANGINSNATSASLQLTQSIFDMSKWRALTLQEKAAGIQ 
DVTYQTDQQTLILNTATAYFNVLNAIDVLSYTQAQKEAIYRQLDQTT 
QRFNVGLVAITDVQNARAQYDTVLANEVTARNNLDNAVEQLRQITGN 
YYPELAALNVENFKTDKPQPVNALLKEAEKRNLSLLQARLSQDLARE 
QIRQAQDGHLPTLDLTASTGISDTSYSGSKTRGAAGTQYDDSNMGQN 
KVGLSFSLPIYQGGMVNSQVKQAQYNFVGASEQLESAHRSVVQTVRS 
SFNNINASISSINAYKQAVVSAQSSLDAMEAGYSVGTRTIVDVLDAT 
TTLYNAKQELANARYNYLINQLNIKSALGTLNEQDLLALNNALSKPV 
STNPENVAPQTPEQNAIADGYAPDSPAPVVQQTSARTTTSNGHNPFRN 

код после> это название, следующий бит, который выглядит, как это «A.41,52» пронумерованы позиции в последовательности, мне нужно сохранить для использования, и все после этого представляет собой аминокислотную последовательность. Я знаю, как бороться с аминокислотной последовательностью, мне просто нужно знать, как отделить важные цифры в первой строке.

В прошлом, когда я только что имел название и последовательность я сделал что-то вроде этого:

for line in nucfile: 
if line.startswith(">"): 
    headerline=line.strip("\n")[1:] 
else: 
    nucseq+=line.strip("\n") 

я на правильном пути здесь? Это мой первый раз, любой совет был бы фантастическим и спасибо за чтение :)

+0

Pleasecheck my edit. Большой знак заблудился в интерпретации блока, но только вы знаете (из нас два), какой вход находится на какой строке. В вашем «прошлом» коде содержимое «заголовка» является «1EK9: ...» «правильно? Я бы не использовал 'nucseq + = line.strip ('\ n')' при итерации по строкам, и это нужно делать часто, поскольку строки в python являются imutable, и это создает некоторую работу ;-) возможно, собирает разделенные строки в (checp) и как постпроцессинг, затем присоединитесь к финальной строке, например '. '.join (the_sequence)' – Dilettant

+1

Спасибо! Да, более высокий знак был только первой строкой.Итак, вместо nucseq + = line.strip ('\ n') вы бы использовали checp? Что это делает? Большое спасибо :) – SammieSam

+0

Извините мобильное устройство и пальцы: это означало «дешево», как в дешевой и быстрой операции, добавляющей список. Затем вы в конце напишите строку назад ito свою переменную с этим вызовом соединения - который объединяет все элементы последовательности со строкой, это метод здесь пространства - HTH, и я вижу много ответов, которые уже здорово. – Dilettant

ответ

0

Я не уверен, что полностью понимаю цель (и я думаю, что этот пост больше подходит для комментария, но у меня нет достаточных привилегий), но я думаю, что ключ к вашему решению - .split(). Вы можете присоединиться к элементам результирующего списка только с помощью + похожее на это:

>>> result = line.split(' ') 
>>> result 
['1EK9:A.41,52;', 'B.61,74;', 'C.247,257;', 'D.279,289', 'ENLMQVYQQARLSNPELRKSAADRDAAFEKINEARSPLLPQLGLGAD', 'YTYSNGYRDANGINSNATSASLQLTQSIFDMSKWRALTLQEKAAGIQ', 'DVTYQTDQQTLILNTATAYFNVLNAIDVLSYTQAQKEAIYRQLDQTT', 'QRFNVGLVAITDVQNARAQYDTVLANEVTARNNLDNAVEQLRQITGN', 

'YYPELAALNVENFKTDKPQPVNALLKEAEKRNLSLLQARLSQDLARE', 'QIRQAQDGHLPTLDLTASTGISDTSYSGSKTRGAAGTQYDDSNMGQN', 'KVGLSFSLPIYQGGMVNSQVKQAQYNFVGASEQLESAHRSVVQTVRS', 'SFNNINASISSINAYKQAVVSAQSSLDAMEAGYSVGTRTIVDVLDAT', 'TTLYNAKQELANARYNYLINQLNIKSALGTLNEQDLLALNNALSKPV', 'STNPENVAPQTPEQNAIADGYAPDSPAPVVQQTSARTTTSNGHNPFRN'] 
    >>> result[3]+result[4] 
    'D.279,289ENLMQVYQQARLSNPELRKSAADRDAAFEKINEARSPLLPQLGLGAD' 
    >>> 

и т.д. Вы можете также использовать обычный синтаксис для извлечения элементов списка, которые вам нужны:

>>> result[5:] 
['YTYSNGYRDANGINSNATSASLQLTQSIFDMSKWRALTLQEKAAGIQ', 'DVTYQTDQQTLILNTATAYFNVLNAIDVLSYTQAQKEAIYRQLDQTT', 'QRFNVGLVAITDVQNARAQYDTVLANEVTARNNLDNAVEQLRQITGN', 'YYPELAALNVENFKTDKPQPVNALLKEAEKRNLSLLQARLSQDLARE', 'QIRQAQDGHLPTLDLTASTGISDTSYSGSKTRGAAGTQYDDSNMGQN', 'KVGLSFSLPIYQGGMVNSQVKQAQYNFVGASEQLESAHRSVVQTVRS', 'SFNNINASISSINAYKQAVVSAQSSLDAMEAGYSVGTRTIVDVLDAT', 'TTLYNAKQELANARYNYLINQLNIKSALGTLNEQDLLALNNALSKPV', 'STNPENVAPQTPEQNAIADGYAPDSPAPVVQQTSARTTTSNGHNPFRN'] 

и присоединиться к ним вместе:

>>> reduce(lambda x, y: x+y, result[5:]) 
'YTYSNGYRDANGINSNATSASLQLTQSIFDMSKWRALTLQEKAAGIQDVTYQTDQQTLILNTATAYFNVLNAIDVLSYTQAQKEAIYRQLDQTTQRFNVGLVAITDVQNARAQYDTVLANEVTARNNLDNAVEQLRQITGNYYPELAALNVENFKTDKPQPVNALLKEAEKRNLSLLQARLSQDLAREQIRQAQDGHLPTLDLTASTGISDTSYSGSKTRGAAGTQYDDSNMGQNKVGLSFSLPIYQGGMVNSQVKQAQYNFVGASEQLESAHRSVVQTVRSSFNNINASISSINAYKQAVVSAQSSLDAMEAGYSVGTRTIVDVLDATTTLYNAKQELANARYNYLINQLNIKSALGTLNEQDLLALNNALSKPVSTNPENVAPQTPEQNAIADGYAPDSPAPVVQQTSARTTTSNGHNPFRN' 

помнить, что + в списках создает список.

Кстати, я бы не удалял «\ n», чтобы начать с него, поскольку вы можете попытаться использовать его для извлечения первой строки, аналогичной приведенной выше, используя пробел для извлечения «слов».

UPDATE (начиная с результата):

#getting A indexes 
letter_seq=result[5:] 
ind=result[:4] 
Aind=ind[0].split('.')[1].replace(';', '') 

#getting one long letter seq 
long_letter_seq=reduce(lambda x, y: x+y, letter_seq) 

#extracting the final seq fromlong_letter_seq using Aind 
output = long_letter_seq[int(Aind.split(',')[0]):int(Aind.split(',')[1])] 

последняя строка просто объединение нескольких операций, которые также использовались ранее.

То же самое для B C D и т.д. - так много ручной работы и расчетов ...

БУДЬТЕ ОСТОРОЖНЫ с индексами А - нумерация начинается в питона от 0, который не может быть дело в вашей системе нумерации.

Более элегантное решение будет использовать re (https://docs.python.org/2/library/re.html), чтобы найти pettern, используя маску, но для этого требуются очень четкие правила для поиска необходимой последовательности.

UPDATE2: мне также непонятно, какова роль пространств - пока я их удалил, но они могут иметь значение при подсчете букв в исходной строке.

+0

Спасибо! Хорошо объяснять лучше, эта часть «A.41,52» говорит мне интересную позицию в следующем AAseq. Это означает, что аминокислота с 41 по 52 важна, и мне нужно вывести их для дальнейшей работы с ними. так что мне нужен способ сохранить только эти числа, чтобы я мог позже сказать, что программа ok выведет последовательность из 41-52 и сделайте некоторую работу для меня. Теперь, для вашего 1-го бита кода вы разбиваете файл txt пробелами, верно? Просто делает их список сейчас? Для второго бита вы показываете список из пункта 5 и далее? Последний кусок, я не понимаю. Еще раз спасибо, это очень полезно :) – SammieSam

+0

вам нужно было бы еще разделить результаты первого сета, используя '.' в качестве разделителя (например, list.split() [0] .split ('.')), а затем работать с результирующим списком ... Затем вы передаете элементы этого двухуровневого списка разбиения на int (int (list.split() [0] .split ('.')) И использовать их в качестве индексов для извлечения последовательностей из элементов списка из первого разделения ... да, это боль, и нет действительно эффективного и приятного способа сделайте это .. Немного совет - для этого, как это, используйте interdictive python - намного легче контролировать результат, так как ваша проблема - это сложность данных, а не код как таковой .... – VDV

+0

В коде - 1 часть да, разделяющая пробелы. 2-й - правый, как вы сказали. уменьшить часть - просто простой способ придерживаться всех последовательностей букв (начиная с 5), а не делать + несколько раз (+ - простой способ склеить два списки вместе и последовательности букв - это списки в python. В моем предваритеном комментарии есть опечатка в коде - следует читать list.split ('') [0] .split ('.') – VDV

0

Я предлагаю вам использовать метод split().

split() позволяет указать разделитель по вашему выбору. Если название последовательности (здесь 1EK9) всегда отделено от остальной части последовательности двоеточием, вы можете сначала передать «:» в качестве разделителя. Затем вы можете разделить оставшуюся часть последовательности, чтобы восстановить пронумерованные позиции (например, A.41,52), используя «;» как разделитель.

Надеюсь, это поможет!

+0

Спасибо, что ответили! Мой вопрос с расколом, дает ли он список? В примерах, которые я видел, он разделяет что-то вроде [«first thing», «second thing», «etc»] правильно? Мог ли я, в свою очередь, сделать эти предметы своей собственной переменной? – SammieSam

+0

Да Sammie, вывод list.split() - это список! Вы можете легко проверить это с помощью метода [type()] (http://www.tutorialspoint.com/python/dictionary_type.htm). – Sheldon

+0

Хорошо, так что я бы поставил variablename.split()? И тогда я мог бы захватить куски этого списка и сделать свою собственную переменную, не так ли? – SammieSam

0

Я думаю, что вы пытаетесь извлечь некоторые части последовательности на основе их идентификаторов, данных вам в первой строке (строка, начинающаяся с >).

Эта строка содержит ваше название, а затем имя последовательности и диапазон данных, который необходимо извлечь.

Попробуйте:

sequence_pairs = {} 

with open('somefile.txt') as f: 
    header_line = next(f) 
    sequence = f.read() 
    title,components = header_line.split(':') 
    pairs = components.split(';') 
    for pair in pairs: 
     start,end = pair[2:-1].split(',') 
     sequence_pars[pair[:1]] = sequence[start:int(end)+1] 

for sequence,data in sequence_pairs.iteritems(): 
    print('{} - {}'.format(sequence, data)) 
+0

Спасибо! Не могли бы вы объяснить мне, что делают эти шаги? Мне жаль, что это немного выше моего понимания. :) – SammieSam

+0

Кроме того, я подключил его, чтобы посмотреть, что это заставляет меня, но я получаю сообщение об ошибке «Смешение итерации и чтение методов потеряют данные». Знаете ли вы, что это значит? lol Прошу прощения, я не очень хорош в этом :) – SammieSam

0

качестве другого ответа может быть очень хорошо, чтобы решать предполагаемую проблему в полном комплекте - но ОП запросившие указатели или пример tpyical сплит-неразъемные преобразования, который часто так успешно я предоставляю некоторые идеи и рабочий код, чтобы показать это (на примере вопроса).

Так давайте сосредоточимся на другое отделение ниже:

from __future__ import print_function 
nuc_seq = [] # a list 
title_token = '>' 
with open('some_file_of_a_kind.txt', 'rt') as f: 
    for line in f.readlines(): 
     s_line = line.strip() # this strips whitespace 
     if line.startswith(title_token): 
      headerline = line.strip("\n")[1:] 
     else: 
      nuc_seq.append(s_line) # build list 

# now nuc_seq is a list of strings like: 
# ['ENLMQVYQQARLSNPELRKSAADRDAAFEKINEARSPLLPQLGLGAD', 
# 'YTYSNGYRDANGINSNATSASLQLTQSIFDMSKWRALTLQEKAAGIQ', 
# ... 
# ] 

demo_nuc_str = ''.join(nuc_seq) 
# now: 
# demo_nuc_str == 'ENLMQVYQQARLSNPELRKSAADRDAAFEKINEARSPLLPQLGLGADYTYSNGYR ...' 

Это быстро и широко развернутую парадигму программирования Python (и программирование с помощью мощных типов данных в целом).

Если метод split-unsplit (a.k.a. join) пока неясен, просто спросите или попробуйте исправить SO на отличные ответы на связанные вопросы.

Также обратите внимание, что нет никакой необходимости line.strip('\n'), как \n считаются пробельным как ' ' (строка только с пробелом) или табулятор '\t', образец:

>>> a = ' \t \n ' 
>>> '+'.join(a.split()) 
'' 

Так что «присоединение символ» появляется только , если есть хотя бы два элемента sto join, и в этом случае strip удалил все пустое пространство и оставил нам пустую строку.

Upate:

В соответствии с просьбой провести дополнительный анализ в "координатной части" в строке под названием заголовок вопроса:

>1EK9:A.41,52; B.61,74; C.247,257; D.279,289 

Если вы хотите получить:

A.41,52; B.61,74; C.247,257; D.279,289 

и предположим, что у вас есть (как указано выше в строке строки заголовка):

title, coordinate_string = headline.split(':') 
# so now title is '1EK9' and 
# coordinates == 'A.41,52; B.61,74; C.247,257; D.279,289' 

Теперь разделить на полу двоеточием, обрезать записи:

het_seq = [z.strip() для г в coordinates.split (';')] # теперь het_seq == [ 'A .41,52 ',' B.61,74 ',' C.247,257 ',' D.279,289 ']

Если «a», «B», «C» и «D» являются хорошо известными измерениями, вы можете «потерять» информацию о заказе из входного файла (так как вы всегда можете укрепить то, что вы уже знать ;-) и может отображать coordinats как ключ: (упорядоченные координатно-пара):

>>> coord_map = dict(
     (a, tuple(int(k) for k in bc.split(','))) 
     for a, bc in (abc.split('.') for abc in het_seq)) 
>>> coord_map 
{'A': (41, 52), 'C': (247, 257), 'B': (61, 74), 'D': (279, 289)} 

в контексте микро программы:

#! /usr/bin/enc python 
from __future__ import print_function 

het_seq = ['A.41,52', 'B.61,74', 'C.247,257', 'D.279,289'] 

coord_map = dict(
    (a, tuple(int(k) for k in bc.split(','))) 
    for a, bc in (abc.split('.') for abc in het_seq)) 
print(coord_map) 

урожайности:

{'A': (41, 52), 'C': (247, 257), 'B': (61, 74), 'D': (279, 289)} 

Здесь можно было бы написать этот явный вложенный цикл, но это поздно европейский вечер так Хитрость заключается в том, чтобы прочитать его справа:

  1. для всех элементов het_seq
  2. расщепленных на точку и магазина, оставленных в a и right в b
  3. , чем дальше разделить bc на последовательность k, преобразовать в целое и положить в кортеж (упорядоченная пара целых координат)
  4. прибыл слева, вы построили кортеж a (" как «A» и координатный набор из 3.

В конце концов вызвать Dict() функцию, которая строит словарь, используя здесь вид Dict (Key_1, значение_1 hey_2 значение_2, ...), что дает {Key_1: value1, ...}

Так все координаты являются целыми числами, сохраняются упорядоченные пары в виде кортежей.

I'ld предпочитают кортежи здесь, хотя раскол() генерирует списки, потому что

  1. Вы сохраните эти две координаты не распространяется или добавить эту пару
  2. В отображении питона и переназначения часто выполняется и там хешируемый (то есть неизменный тип) готов стать ключом в dict.

Один последний вариант (без knoted постижений):

coord_map = {} 
for abc in het_seq: 
    a, bc = abc.split('.') 
    coord_map[a] = tuple(int(k) for k in bc.split(',')) 
print(coord_map) 

Первые четыре линии производят так же, как выше незначительные отвратительной «один лайнер» (что уже было написано на три строки хранятся вместе в круглые скобки).

HTH.

+0

Спасибо! Это действительно полезно, и он печатает только мою последовательность. Мой следующий вопрос: как получить части «A.41,52»? – SammieSam

+0

Подождите, я думаю, что получаю это сейчас – SammieSam

+0

Это хорошо - не смотрел комментарии при вводе «ответа» на «следующий вопрос», может быть, это помогает мне написать - напишет некоторые комментарии к последнему шагу деактивации разбиения – Dilettant

0

Так что я предполагаю, что вы пытаетесь обработать файл Fasta, и поэтому я бы это сделал, чтобы сначала получить заголовок и отделить части с помощью Regex. После этого вы можете сохранить A: 42.52 B ... в списке для легкого доступа. Код выглядит следующим образом.

import re 

def processHeader(line): 
    positions = re.search(r':(.*)', line).group(1) 
    positions = positions.split('; ') 
    return positions 

dnaSeq = '' 
positions = [] 
with open('myFasta', 'r') as infile: 
    for line in infile: 
      if '>' in line: 
       positions = processHeader(line) 
      else: 
       dnaSeq += line.strip() 
Смежные вопросы