AttributeError: 'tuple' 对象没有属性 'append'

Mat*_*att 3 python tuples

任何人都可以帮助我使用此代码吗?

Jobs = ()
openFile = open('Jobs.txt')
x = 1
while x != 0:
    Stuff = openFile.readline(x)
    if Stuff != '':
        Jobs.append(Stuff)
    else:
        x = 0
Run Code Online (Sandbox Code Playgroud)

此代码抛出:

AttributeError: 'tuple' object has no attribute 'append'
Run Code Online (Sandbox Code Playgroud)

我正在使用 Python 3.6。

MSe*_*ert 8

在行中:

Jobs = ()
Run Code Online (Sandbox Code Playgroud)

你创建一个tuple. Atuple是不可变的,并且没有添加、删除或更改元素的方法。您可能想要创建一个list(列表有一个.append-method)。要创建列表,请使用方括号而不是圆括号:

Jobs = []
Run Code Online (Sandbox Code Playgroud)

或使用list-"构造函数":

Jobs = list()
Run Code Online (Sandbox Code Playgroud)

但是,对您的代码的一些建议:

opening 一个文件需要你close再次。否则,只要 Python 正在运行,它就会保留文件句柄。为了更容易,有一个上下文管理器:

with open('Jobs.txt') as openFile:
    x = 1
    while x != 0:
        Stuff = openFile.readline(x)
        if Stuff != '':
            Jobs.append(Stuff)
        else:
            x = 0
Run Code Online (Sandbox Code Playgroud)

一旦上下文管理器完成,即使发生异常,文件也会自动关闭。


它很少使用,但iter接受两个参数。如果你给它两个参数,那么它会在每次迭代中调用第一个参数,并在遇到第二个参数时立即停止。这似乎非常适合这里:

with open('Jobs.txt') as openFile:
    for Stuff in iter(openFile.readline, ''):
        Jobs.append(Stuff)
Run Code Online (Sandbox Code Playgroud)

我不确定这是否真的像预期的那样工作,因为openFile.readline不断尾随换行符 ( \n) 所以如果你想停在你需要的第一个空行for Stuff in iter(openFile.readline, '\n')。(也可能是我电脑上的一个 windows 东西,如果你没有问题,请忽略这个!)


这也可以在两行中完成,而无需Jobs在开始循环之前创建:

with open('Jobs.txt') as openFile:
    # you could also use "tuple" instead of "list" here.
    Jobs = list(iter(openFile.readline, ''))  
Run Code Online (Sandbox Code Playgroud)

除了iter两个参数外,您还可以使用itertools.takewhile

import itertools
with open('Jobs.txt') as openFile:
    Jobs = list(itertools.takewhile(lambda x: x != '', openFile))
Run Code Online (Sandbox Code Playgroud)

lambda有点慢,如果你需要更快,你也可以使用''.__ne__or bool(后者有效,因为被认为是空字符串False):

import itertools
with open('Jobs.txt') as openFile:
    Jobs = list(itertools.takewhile(''.__ne__, openFile))
Run Code Online (Sandbox Code Playgroud)