EXPLAIN - объект 'float' не поддерживает назначение элементов - PullRequest
0 голосов
/ 19 июня 2020
fname=open('C:\Program Files (x86)\Python38-32\mbox-short.txt','r')
count=0
val=0.000
for num in fname:
    if num.startswith('X-DSPAM-Confidence:'):
        count=count+1
        for i in num:
            val[i]=num[19:25]          #error
            print(i,val)

Если я не назначу val = 0,000, появится эта ошибка: name 'val' is not defined. Это возможно из-за локального объявления, а не глобально (это мое восприятие), поэтому я присваиваю значение 'val'.

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Я предлагаю - см. В конце ответа - исправленный код, основанный на разумном предположении о том, чего вы, возможно, пытаетесь достичь (хотя это не совсем ясно в вопросе).

Этот код откроет файл и 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)
0 голосов
/ 19 июня 2020

вы не можете выполнять итерацию по числу, но вы можете использовать массив, если вам не нужно val из l oop просто

for num in fname:
    if num.startswith('X-DSPAM-Confidence:'):
        count=count+1
        for i in num:
            print(i, num[19:25]) 

, если вы хотите, чтобы карта делала :

count=0
val={}
for num in fname:
    if num.startswith('X-DSPAM-Confidence:'):
        count=count+1
        for i in num:
            val[i]=num[19:25]         
            print(i, val[i])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...