2013-08-21 4 views
1

У меня есть данные, которые выглядят следующим образом:создание списка из разделенных строк

-HI5UHB101EPGLJ rank=0000024 x=1813.0 y=437.0 length=81 
ACGTAGATCGTGTAGCTGAGGATGTTGACAACCATGTGGACAGAGCCTCACCATCAACAT 
CCTCAGCTACACGATCTGCGT 
-HI5UHB101BDVPE rank=0000032 x=451.5 y=48.0 length=73 
ACGTAGATCGTCTTGAGTGATTACAGATCTAATACAATGTGCAGTCTAGCTAGATGTTAT 
TCTATATATATAC 
-HI5UHB101AL8KC rank=0000049 x=136.0 y=586.0 length=58 
ACGTAGATCGTCTCGGCTAGTAGACGAGCCATCGTCTACTAGCCGAGACGATCTGCGT 

Как сделать это в CSV лист, который выглядит следующим образом:

'HI5UHB101EPGLJ', 'rank=0000024', 'x=1813.0', 'y=437.0', 'length=81','ACGTAGATCGTGTAGCTGAGGATGTTGACAACCATGTGGACAGAGCCTCACCATCAACATCCTCAGCTACACGATCTGCGT' 
'HI5UHB101BDVPE', 'rank=0000032', 'x=451.5', 'y=48.0', 'length=73', 'ACGTAGATCGTCTTGAGTGATTACAGATCTAATACAATGTGCAGTCTAGCTAGATGTTATTCTATATATATAC' 
'HI5UHB101AL8KC', 'rank=0000049', 'x=136.0', 'y=586.0', 'length=58', 'ACGTAGATCGTCTCGGCTAGTAGACGAGCCATCGTCTACTAGCCGAGACGATCTGCGT' 

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

Любая помощь будет оценена по достоинству. Это будет запущено в HUGE файле.

+0

кажется JSON более естественный формат сериализации в, нет? – roippi

+0

@roippi: почему? CSV отлично обслуживается. –

+0

Возможно, вам понадобятся библиотеки Biopython, в частности SeqIO: http://biopython.org/wiki/SeqIO. Я не сразу распознаю ваш формат, но если он стандартный, вполне возможно, что в этой библиотеке могут быть инструменты для чтения , –

ответ

4

Используйте функцию генератора для обнаружения новых записей по пусковому -:

def per_section(iterable): 
    row = [] 
    for line in iterable: 
     if line.startswith('-'): 
      if row: 
       yield row 
      row = line[1:].split() + [''] 
     else: 
      row[-1] += line.strip() 
    if row: 
     yield row 

Это дает полные рекомбинантные разделы, готовые писать в CSV.

with open(inputfile) as infile, open(outputfile, 'wb') as outfile: 
    csvwriter = csv.writer(outfile) 
    csvwriter.writerows(per_section(infile)) 

Для вашего ввода образца, который производит:

HI5UHB101EPGLJ,rank=0000024,x=1813.0,y=437.0,length=81,ACGTAGATCGTGTAGCTGAGGATGTTGACAACCATGTGGACAGAGCCTCACCATCAACATCCTCAGCTACACGATCTGCGT 
HI5UHB101BDVPE,rank=0000032,x=451.5,y=48.0,length=73,ACGTAGATCGTCTTGAGTGATTACAGATCTAATACAATGTGCAGTCTAGCTAGATGTTATTCTATATATATAC 
HI5UHB101AL8KC,rank=0000049,x=136.0,y=586.0,length=58,ACGTAGATCGTCTCGGCTAGTAGACGAGCCATCGTCTACTAGCCGAGACGATCTGCGT 
+0

Вам нужны одинарные кавычки вокруг элементов и, возможно, пробелы после запятых. – Jiminion

+0

@Jim: это только настройка CSV-выхода, см. Документацию модуля 'csv'. –

+0

Вы не представляете, насколько вы улучшили свою жизнь! Спасибо! – AishaAJ

0

Что-то, как это должно работать ...

f= open("data.txt") 
fo = open("done.txt","w") 
line = f.readline() 
while(len(line) > 0): 
    #print line 
    if (line[0] == '-'): 
     label, rank, xval, yval, lenval = line.split(" ") 
     lenval = lenval.strip('\n') 
     #print label,rank, xval,yval,lenval 
     line2 = f.readline() 
     code = line2 
     line2 = f.readline() 
     while(len(line2.strip()) > 0): 
      code = code+line2.strip() 
      line2 = f.readline() 
     #print code 
     lineout = "'"+label[1:]+"', '"+rank+"', '"+xval+","+yval+"', '"+lenval+"', " 
     lineout = lineout+"'"+code+"'\n" 
     fo.write(lineout) 
    line = f.readline() 
f.close() 
fo.close() 
+0

Я думал, что вам нужна вторая строка для кода. OP, чтобы комбинировать линию кода с другими свойствами ..... :) – Jiminion

+0

Исправлено отображение одного вывода на запись. – Jiminion

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