2015-10-19 4 views
-2

Я искал эту ошибку здесь, но не видел ничего, что еще соответствует моей ситуации (отказ от ответственности, я до сих пор привык к Python).Python - объект 'str' не имеет атрибута 'append'

import os 
    os.chdir("C:\Projects\Rio_Grande\SFR_Checking") # set working directory 

    stressPeriod = 1 
    segCounter = 1 
    inFlow = 0 
    outFlow = 0 

    with open(r"C:\Projects\streamflow.dat") as inputFile: 
     inputList = list(inputFile) 

    while stressPeriod <= 1: 
     segCounter = 1 
     lineCounter = 1 
     outputFile = open("stats.txt", 'w') # Create the output file 
     for lineItem in inputList: 
      if (((stressPeriod - 1) * 11328) + 8) < lineCounter <= (stressPeriod * 11328): 
       lineItem = lineItem.split() 
       if int(lineItem[3]) == int(segCounter) and int(lineItem[4]) == int(1): 
        inFlow = lineItem[5] 
        outFlow = lineItem[7] 
        lineItemMem = lineItem 
       elif int(lineItem[3]) == int(segCounter) and int(lineItem[4]) <> int(1): 
        outFlow = lineItem[7] 
       else: 
        gainLoss = str(float(outFlow) - float(inFlow)) 
        lineItemMem.append(gainLoss) 
        lineItemMem = ','.join(lineItemMem) 
        outputFile.write(lineItemMem + "\n") # write # lines to file 
        segCounter += 1 
        inFlow = lineItem[5] 
        outFlow = lineItem[7] 
      lineCounter += 1 
outputFile.close() 

Поэтому в основном эта программа должна читать файл .dat и разобрать bits информации из него. Я разбиваю каждую строку файла на список, чтобы сделать на нем math (математические операции между различными строками в файле, что усложняет код). Затем я добавляю новый номер в конец списка для данной строки, и именно там вещи необъяснимо ломаются. Я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "C:/Users/Chuck/Desktop/Python/SFR/SFRParser2.py", line 49, in <module> 
    lineItemMem.append(gainLoss) 
AttributeError: 'str' object has no attribute 'append' 

Когда я даю ему команду печати, чтобы проверить, что на самом деле lineItemMem список, а не строка, то она выводит список для меня. Если я положил код для

lineItemMem.split(","), чтобы сломать строку, я получаю сообщение об ошибке, что list объект не имеет атрибута split. Поэтому в основном, когда я пытаюсь выполнить операции list, ошибка говорит о ее string, и когда я пытаюсь выполнить строковые операции, ошибка говорит, что это список. Я пробовал честно обмахивать, но, честно говоря, не могу понять, в чем проблема. Спасибо, спасибо за понимание.

+0

Строки неизменяемы. –

+0

Что такое 'type (lineItemMem)'? – ppperry

ответ

0

Есть два места, где установлен lineItemMem. Первый заключается в следующем:

lineItem = lineItem.split() 
# ... 
    lineItemMem = lineItem 

, где он установлен в результате операции разделения, то есть в списке.

Второе место это:

lineItemMem = ','.join(lineItemMem) 

здесь, он устанавливается в результате операции соединения, то есть строка.

Итак, причина, по которой в этой ошибке иногда указывается, что это строка, а иногда и список, то есть acutally случай в зависимости от условий в инструкции if.

Код, представленный, является imho вблизи undebuggable. Вместо того, чтобы возиться, лучше было бы подумать о различных целях, которые должны быть достигнуты (чтение файла, разбор содержимого, форматирование данных, их запись в другой файл) и их решение в отдельности.

3

Я думаю, что вопрос должен делать с этими линиями:

   lineItemMem.append(gainLoss) 
       lineItemMem = ','.join(lineItemMem) 

Первоначально lineItemMem список, и вы можете добавить элемент в конец. Однако вызов join, который вы делаете, превращает список в строку. Это означает, что в следующий раз, когда эта часть кода будет запущена, вызов append завершится с ошибкой.

Я не уверен, что это лучшее решение. Возможно, вы должны использовать другую переменную для строковой версии? Или, возможно, после объединения элементов списка в одну строку и записи этого результата вы должны повторно инициализировать переменную lineItemMem в новый пустой список? Вам нужно будет решить, что лучше всего подходит для ваших реальных целей.

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