Я предлагаю - см. В конце ответа - исправленный код, основанный на разумном предположении о том, чего вы, возможно, пытаетесь достичь (хотя это не совсем ясно в вопросе).
Этот код откроет файл и l oop над строками, а для тех, которые начинаются с 'X-DSPAM-Confidence:'
, он извлечет соответствующую подстроку и ее в значение с плавающей запятой и распечатает ее, а также сохранит ее в списке с именем values
.
Переменная, которую вы назвали num
, похоже, предназначена для хранения строки. Это синтаксически допустимо, но, вероятно, не поможет читателю иметь имя, которое предполагает другое назначение, поэтому оно переименовано здесь как line
.
В вашем коде есть аналогичная проблема с переменной с именем fname
, название которого предполагает, что он будет содержать имя файла, но на самом деле содержит дескриптор файла, возвращаемый функцией open
. В обновленном коде эта переменная используется для хранения самого имени; фактический дескриптор файла в этом случае не нужно хранить в переменной.
Специфическая ошибка c, которую вы получали, заключалась в попытке проиндексировать число с плавающей запятой с именем val
. Поплавок - это не тип данных, который можно использовать таким образом (назначение элемента), и в этом конкретном случае вы, вероятно, хотели использовать список. Я использовал список в предложенном коде под названием values
. Элементы этого могут быть назначены, например, с помощью values[i] = value
. Однако это можно использовать только для изменения содержимого существующего элемента списка, а не для изменения длины списка. Чтобы добавить еще один элемент в список внутри l oop, вы должны вместо этого вызвать метод append
вашего списка values
, передав параметр, который является элементом, который вы хотите добавить в список (который я назвал value
).
Этот код предполагает, что данные в строке line[19:25]
можно преобразовать в число с плавающей запятой. Если это не так (например, он состоит из буквенных символов), тогда код сообщит об ошибке и остановится. Как справиться с этой ошибкой, вероятно, выходит за рамки этого вопроса, но при необходимости это можно сделать.
Последний второстепенный комментарий: поскольку путь к файлу содержит \
символов, необходимо поставить r
непосредственно перед открытыми котировками в первой строке. Это сделано для того, чтобы символ \
не имел специального значения в качестве escape-символа при обработке строк.
fname = r'C:\Program Files (x86)\Python38-32\mbox-short.txt'
count = 0
values = []
for line in open(fname, 'r'):
if line.startswith('X-DSPAM-Confidence:'):
count = count + 1
value = float(line[19:25])
values.append(value)
print(count, value)