2015-10-19 121 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 

其中它被設置爲分割操作的結果,即List。

的第二位的是這樣的:

lineItemMem = ','.join(lineItemMem) 

這裏,它被設置爲一個聯接操作的結果,即一個字符串。

所以,錯誤的原因有時會說明它是一個字符串,有時候是一個列表,那就是根據if語句中的條件情況

提供的代碼是imho接近undebuggable。而不是修補,這將是一個更好的方法來思考應該實現的不同目標(閱讀文件,解析內容,格式化數據,將其寫入另一個文件)並單獨解決它們。

3

我認爲這個問題與這些線做:

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

最初lineItemMem是一個列表,您可以附加一個項目到它的結束。但是,您要做的join調用將列表變成一個字符串。這意味着下一次代碼的這部分運行時,append調用將失敗。

我不確定最好的解決方案是什麼。也許你應該爲字符串版本使用一個不同的變量?或者,也許在將列表項一起加入單個字符串並寫出結果後,應該將lineItemMem變量重新初始化爲新的空列表?你必須決定什麼最適合你的實際目標。

相關問題