функция del не работает должным образом

Не могли бы вы помочь мне со следующим кодом:

#! /usr/bin/env python

stop = "0"

while(stop == "0"):
    infile = open(raw_input("Enter input filename: "), 'r')
    outfile = open(raw_input("Enter output filename: "), 'w')

    err = raw_input("Give max intensity: ")

    outfile.write("#" + "\n")

    for line in infile.readlines()[1:]:
        line = line.strip()
        line_col = line.split()
        if line_col[3] <= err:
            outfile.write(line + "\n")           
        else:
            del line
    stop = raw_input("Would like to quit the program? Yes = 1 No = 0: ")

infile.close()
outfile.close()

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

Проблема в том, что почему-то удаляются не все нужные строки. Если err = 500, то все 3-значные номера выше 500 (например, 653.61511, 989.76770, 614.62500 и т. д.) будут удалены, однако 4-значные номера (например, 1001.15637, 1628.09155, 2444.60400 и т. д.) не удаляются!

Файл, с которым я работаю, приведен ниже:

-8.0 4.0 3.695 265.81021 265.8102
-8.0 4.0 3.721 274.50510 274.5051
-8.0 4.0 3.746 285.87451 285.8745
-8.0 4.0 3.771 301.65869 301.6587
-8.0 4.0 3.796 324.28391 324.2839
-8.0 4.0 3.821 356.89609 356.8961
-8.0 4.0 3.846 405.96741 405.9674
-8.0 4.0 3.872 488.77600 488.7760
-8.0 4.0 3.897 653.61511 653.6151
-8.0 4.0 3.922 1001.15637 1001.1564
-8.0 4.0 3.947 1628.09155 1628.0916
-8.0 4.0 3.972 2444.60400 2444.6040
-8.0 4.0 4.023 3092.76880 3092.7688
-8.0 4.0 4.048 2488.82031 2488.8203
-8.0 4.0 4.073 1653.13733 1653.1373
-8.0 4.0 4.098 989.76770 989.7677
-8.0 4.0 4.123 614.62500 614.6250

Я ни в коем случае не являюсь экспертом в кодировании на python, поэтому любая помощь в этом вопросе будет очень признательна...


person pinchear    schedule 22.09.2014    source источник
comment
Что именно вы ожидаете от функции del здесь? Судя по моему прочтению этого кода, он бесполезен, и вы получите точно такое же поведение, полностью удалив ветвь else: оператора if.   -  person Charles Duffy    schedule 22.09.2014
comment
Использование del для переменной почти никогда не является тем, что вы хотите сделать.   -  person user2357112 supports Monica    schedule 22.09.2014
comment
Я хочу, чтобы он удалил строку данных, если число в 4-м столбце выше «ошибки»   -  person pinchear    schedule 22.09.2014
comment
... имейте в виду, что даже если del удаляет "строку" из памяти, "строка" должна была быть заменена в памяти в любом случае, как только будет прочитана другая строка, поэтому использование del ничего не меняет в том, как ваш код действует.   -  person Charles Duffy    schedule 22.09.2014


Ответы (1)


Проблема не в del, который здесь, кстати, ничего не делает, а в сравнении двух строк.

Откройте интерпретатор Python и напишите:

"1001" < "3"

Вы вернетесь True. Это потому, что Python выполняет лексикографическое сравнение двух строк. Вам нужно сравнить два числа, например:

1001 < 3

Что возвращает False, как и следовало ожидать.

В вашем коде line_col[3] — это строка, как и err, поэтому Python выполняет первый тип сравнения. Вам нужно будет преобразовать их в числа, чтобы получить желаемое поведение, написав, например: float(line_col[3]) < float(err).

person jme    schedule 22.09.2014
comment
Без проблем. Убедитесь, что вы прочитали некоторые другие ответы, чтобы точно понять, почему del здесь ничего не делает, и когда вы действительно хотите его использовать. - person jme; 22.09.2014