2014-01-24 2 views
1

У меня есть огромный выходной файл взрыва в табличном формате. Я хочу сортировать свои данные в соответствии с названиями белков, чтобы увидеть, какие seq-s соответствуют этому конкретному белку. Скажем, у меня естьСортировка .txt-файла по имени в python

con19 sp|Q24K02|IDE_BOVIN 3 
con19 sp|P35559|IDE_RAT 2 
con15 sp|Q24K02|IDE_BOVIN 8 
con15 sp|P14735|IDE_HUMAN 30 
con16 sp|Q24K02|IDE_BOVIN 45 
con16 sp|P35559|IDE_RAT 23 

Я хочу, чтобы получить выход, оба OK

sp|Q24K02|IDE_BOVIN con19 3   sp|Q24K02|IDE_BOVIN con19 3 
        con15 8   sp|Q24K02|IDE_BOVIN con15 8 
        con16 45   sp|Q24K02|IDE_BOVIN con16 45 
sp|P35559|IDE_RAT con19 2   sp|P35559|IDE_RAT con19 2   
        con16 23   sp|P35559|IDE_RAT con16 23 
sp|P14735|IDE_HUMAN con15 30   sp|P14735|IDE_HUMAN con15 30 



f1 = open('file.txt','r') 
lines=f1.readlines() 
for line in lines: 
    a=sorted(lines) 
    r=open('file.txt','w') 
    r.writelines(a) 
f1.close  
+3

Что вы уже пробовали? – EarlGrey

+0

Я попытался выполнить сортировку по алфавиту, используя sorted(), работает для небольших файлов, но, похоже, не работает над моим огромным файлом – user3224522

+1

f1 = open ('file.txt', 'r') lines = f1.readlines() для линии в линии: а = отсортирован (линии) г = открыт ('file.txt', 'ж') r.writelines (а) f1.close – user3224522

ответ

2

Проблема заключается в том, что вы вызываете отсортированы один раз для каждой строки (т.е. внутри цикла), а не для набора линий всего. Попробуйте это вместо:

f1 = open('file.txt','r') 
a=sorted(f1.readlines(), key=lambda l:l.split('|')[1]) 
r=open('file.txt','w') 
r.writelines(a) 
f1.close  
+0

Этот код сортирует строки по первому столбцу, но их следует сортировать по первому второму столбцу. – EarlGrey

+0

Мне нужно отсортировать всю строку, но в соответствии с столбцом 2, который является названием белков – user3224522

+2

@ user3224522 ОК, файл теперь будет отсортирован по второму столбцу. Вы понимаете, почему вы не хотите вызывать сортировку внутри цикла? – cmh

2

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

with open('infile.txt') as f_in, open('outfile.txt', 'w') as f_out: 
    f_out.write(''.join(sorted(f_in, key=lambda x: x.split()[1:2]))) 
Смежные вопросы