Python - 'str'对象没有属性'append'

时间:2015-10-19 19:20:33

标签: python string list

我在这里搜索过这个错误,但没有看到任何符合我情况的内容(免责声明,我还习惯Python)。

    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,当我尝试执行字符串操作时,错误表明它是一个列表。我已经尝试了很多东西,但坦率地说不出这里的问题。感谢任何见解,谢谢。

2 个答案:

答案 0 :(得分:3)

我认为这个问题与这些问题有关:

Aspnetcompatiblitymode

最初 lineItemMem.append(gainLoss) lineItemMem = ','.join(lineItemMem) 是一个列表,您可以将项目附加到其末尾。但是,您正在执行的lineItemMem调用会将列表转换为字符串。这意味着下次此部分代码运行时,join调用将失败。

我不确定最佳解决方案是什么。也许您应该为字符串版本使用不同的变量?或者也许在将列表项一起加入单个字符串并将结果写出来之后,您应该将append变量重新初始化为新的空列表?你必须决定什么最适合你的实际目标。

答案 1 :(得分:0)

有两个地方设置了lineItemMem。首先是:

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

将其设置为拆分操作的结果,即List。

第二位是:

lineItemMem = ','.join(lineItemMem)

这里,它被设置为连接操作的结果,即字符串。

因此,错误有时会表明它是一个字符串,有时候是一个列表的原因是实际上是,具体取决于if语句中的条件。

如上所述,代码几乎不可取代。考虑应该实现的不同目标(读取文件,解析内容,格式化数据,将其写入另一个文件)并单独处理它们将是一种更好的方法,而不是修修补补。