2010-04-12 3 views
2

Образец следующего текстового файла у меня есть:Удаление строк в текстовом файле

> 1 -4.6 -4.6 -7.6 
> 
> 2 -1.7 -3.8 -3.1 
> 
> 3 -1.6 -1.6 -3.1 

данные разделены вкладки в текстовом файле, и первый столбец указывает положение.

Мне нужно перебирать каждое значение в текстовом файле отдельно от столбца 0 и находить наименьшее значение.

после того, как было обнаружено самое низкое значение, которое необходимо записать в новый текстовый файл вместе с именем и положением столбца. Столбец 0 имеет название «позиция» Столбец 1 «пятнадцать», столбец 2 «шестнадцать» и столбец 3 «семнадцать»

, например, самое низкое значение в приведенных выше данных - «-7,6» и находится в столбце 3, который имеет название «семнадцать». Поэтому «7.6», «семнадцать» и его значение позиции, которое в этом случае равно 1, необходимо записать в новый текстовый файл.

Затем мне нужно удалить несколько строк из вышеуказанного текстового файла.

E.G. самое низкое значение выше «-7,6» и находится в позиции «1» и находится в столбце 3, который как название «семнадцать». Поэтому мне требуется семнадцать строк, удаленных из текстового файла, начиная с и начиная с позиции 1

поэтому столбец, в котором находится самое низкое значение, обозначает количество строк, которое необходимо удалить, и положение, в котором оно найдено, Начальная точка удаления

+0

Показать использовать код, который вы пытались – Mark

+2

Ваши требования причудливы. Какова мотивация для этого? –

+0

Его текстовый файл, содержащий биологические данные, мне просто нужно найти самые низкие значения без перекрытия, следовательно, удаления. – Jenny

ответ

1

Открыть файл для чтения, другой файл для записи, и скопировать все строки, которые не соответствуют фильтр:

readfile = open('somefile', 'r') 
writefile = open('otherfile', 'w') 

for line in readfile: 
    if not somepredicate(line): 
    writefile.write(line) 

readfile.close() 
writefile.close() 
+0

Конечно, на этом этапе вы можете просто написать свою программу в качестве стандартного входного фильтра (прочитайте с stdin, напишите на stdout) и выполните соответствующие перенаправления из своей оболочки. – jemfinch

+0

Несомненно, это жизнеспособный подход (и тот, который я обычно беру). –

0

Вот колото на то, что я думаю, что ты хотел (хотя ваши требования были довольно сложными):

def extract_bio_data(input_path, output_path): 
    #open the output file and write it's headers 
    output_file = open(output_path, 'w') 
    output_file.write('\t'.join(('position', 'min_value', 'rows_skipped')) + '\n') 

    #map column indexes (after popping the row number) to the number of rows to skip 
    col_index = { 0: 15, 
        1: 16, 
        2: 17 } 

    skip_to_position = 0 
    for line in open(input_path, 'r'): 
     #remove the '> ' from the beginning of the line and strip newline characters off the end 
     line = line[2:].strip() 

     #if the line contains no data, skip it 
     if line == '': 
      continue 

     #split the columns on whitespace (change this to split('\t') for splitting only on tabs) 
     columns = line.split() 

     #extract the row number/position of this data 
     position = int(columns.pop(0)) 

     #this is where we skip rows/positions 
     if position < skip_to_position: 
      continue 

     #if two columns share the minimum value, this will be the first encountered in the list 
     min_index = columns.index(min(columns, key=float)) 

     #this is an integer version of the 'column name' which corresponds to the number of rows that need to be skipped 
     rows_to_skip = col_index[min_index] 

     #write data to your new file (row number, minimum value, number of rows skipped) 
     output_file.write('\t'.join(str(x) for x in (position, columns[min_index], rows_to_skip)) + '\n') 

     #set the number of data rows to skip from this position 
     skip_to_position = position + rows_to_skip 


if __name__ == '__main__': 
    in_path = r'c:\temp\test_input.txt' 
    out_path = r'c:\temp\test_output.txt' 
    extract_bio_data(in_path, out_path) 

вещи, которые не были ясно мне:

  1. Есть ли на самом деле «>» в ​​начале каждой строки или является то, что ошибка копирования/вставки?
    • Я предположил, что это была не ошибка.
  2. Вы хотите, чтобы «7.6» или «-7.6» были записаны в новый файл?
    • Предполагалось, что вы хотите оригинальное значение.
  3. Вы хотите пропустить строки в файле? или позиций, основанных на первом столбце?
    • Я предположил, что вы хотели пропустить позиции.
  4. Вы говорите, что хотите удалить данные из исходного файла.
    • Я предположил, что пропущенных позиций было достаточно.
Смежные вопросы