2013-11-24 2 views
0

Я изучаю Python и создал эту программу, но это не сработает, и я надеюсь, что кто-то найдет ошибку!Удалить строки, начинающиеся с уникального номера

У меня есть файл, который имеет записи, как это:

0 Kurthia sibirica Planococcaceae 
1593 Lactobacillus hordei Lactobacillaceae 
1121 Lactobacillus coleohominis Lactobacillaceae 
614 Lactobacillus coryniformis Lactobacillaceae 
57 Lactobacillus kitasatonis Lactobacillaceae 
3909 Lactobacillus malefermentans Lactobacillaceae 

Моя цель состоит в том, чтобы удалить все строки, которые начинаются с числом, которое происходит только один раз во всем файле (уникальные номера), а также сохранить все строки, начинающиеся с числа, дважды повторяющегося в новом файле. Это моя попытка. Он еще не работает (когда я позволяю работу print линии, одна строка из целых файлов повторяется 3 раза, и это все):

#!/usr/bin/env python 

infilename = 'v35.clusternum.species.txt' 
outfilename = 'v13clusters.no.singletons.txt' 

#remove extra letters and spaces 
x = 0 
with open(infilename, 'r') as infile, open(outfilename, 'w') as outfile: 
     for line in infile: 
       clu, gen, spec, fam = line.split() 
     for clu in line: 
       if clu.count > 1: 
         #print line 
         outfile.write(line) 
       else: 
        x += 1 
print("Number of Singletons:") 
print(x) 

Спасибо за любую помощь!

ответ

2

Хорошо, ваш код идет в правильном направлении, но у вас есть несколько вещей, которые были смущены.

Вам нужно отделить то, что делает ваш скрипт, на два логических шага: один, агрегируя (подсчитывая) все поля clu. Два, записывая каждое поле с номером clu> 1. Вы пытались сделать эти шаги вместе одновременно и ... ну, это не сработало. Вы можете технически сделать это таким образом, но у вас синтаксис неправильный. Это также ужасно неэффективно для непрерывного поиска в вашем файле файлов. Лучше всего делать это один или два раза.

Итак, давайте разберем шаги. Сначала подсчитайте свои поля clu. Модуль collections имеет Counter, который вы можете использовать.

from collections import Counter 
with open(infilename, 'r') as infile: 
    c = Counter(line.split()[0] for line in infile) 

c теперь Counter, что вы можете использовать для просмотра графа данного clu.

with open(infilename, 'r') as infile, open(outfilename, 'w') as outfile: 
     for line in infile: 
       clu, gen, spec, fam = line.split() 
       if c[clu] > 1: 
        outfile.write(line) 
+0

Я думаю, вы имеете в виду 'Counter (line.split() [0] для строки в infile)'? – DSM

+0

@ DSM да, редактирование, как мы говорим. – roippi

+0

@roippi Спасибо за это, это прекрасно! Мне интересно, можете ли вы предложить еще одну вещь: получить подсчет количества номеров, которые были удалены. Итак, если строки, начинающиеся с '0' и' 57' из примера в моем вопросе, появились только один раз, моя «сумма чисел» будет равна 2. Я попытался сделать это и вставил 'else: print ([clu]), 'put просто печатает числа, которые были удалены. – Jen

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