python值太多,无法解压缩xlsxwriter

python值太多,无法解压缩xlsxwriter,python,xlsxwriter,valueerror,Python,Xlsxwriter,Valueerror,我很难找出这里可能存在的问题。我理解这个错误,并按照这里的教程编写excel工作簿,但我仍然不断收到第一个、最后一个帐户的错误: ValueError:太多的值无法解包。如果有人能提供帮助,那就太好了。我尝试过删除create_accounts方法的accounts元组中的first和last name方法,并用string替换,但也没有效果 import xlsxwriter from account import Acc class FillExcel(object): def __in

我很难找出这里可能存在的问题。我理解这个错误,并按照这里的教程编写excel工作簿,但我仍然不断收到第一个、最后一个帐户的错误: ValueError:太多的值无法解包。如果有人能提供帮助,那就太好了。我尝试过删除create_accounts方法的accounts元组中的first和last name方法,并用string替换,但也没有效果

import xlsxwriter
from account import Acc


class FillExcel(object):
def __init__(self):
    self.obj = Acc()

def create_accounts(self):
    workbook = xlsxwriter.Workbook('accounts05.xlsx')
    worksheet = workbook.add_worksheet()

    accounts = ([self.obj.first_name(), self.obj.last_name()])

    # Start from the first cell. Rows and columns are zero indexed.
    row = 0
    col = 0
    print(accounts)
    for first, last in accounts:
        worksheet.write(row, col, first)
        worksheet.write(row, col + 1, last)
        row += 1

    workbook.close()

test = FillExcel()
test.create_accounts()
下面是包含account对象的方法first_name和last_name的类

import random
import string

# create an account array object that will be used
# in xlsxwriter literal

name=["Beck","Glenn","Becker","Carl","Beckett","Samuel","Beddoes","Mick","Beecher"]


class Acc(object):

    def first_name(self):
        f_name = random.choice(name)
        return f_name

    def last_name(self):
        l_name = random.choice(name)
        return l_name

    def addy_line1(self, address):
        chars1 = string.ascii_uppercase
        chars2 = ''.join(random.choice(chars1) for i in range(4))
        return chars2 + address

    def phone_number(self, area_code):
        rand_num = random.sample(range(10), 7)
        number = str((''.join(map(str, rand_num))))
        return area_code + number


if __name__ == "__main__":
    accObj = Acc()
    accObj.first_name()
    accObj.last_name()
    accObj.addy_line1('123 West St.')
    accObj.phone_number('212')
这是我得到的全部例外。编辑

['Blanchet', 'Ingmar']
Traceback (most recent call last):
  File "C:/Users/Carsten/PycharmProjects/Dna_Nike/Obj_Creator.py", line 29, in <module>
test.create_accounts()
  File "C:/Users/Carsten/PycharmProjects/Dna_Nike/Obj_Creator.py", line 21, in create_accounts
    for first, last in accounts:
ValueError: too many values to unpack (expected 2)
问题在于:

accounts = ([self.obj.first_name(), self.obj.last_name()])
乍一看,这看起来像一个列表的元组,元组中唯一的列表有两个值。所以,首先,最后一个原因是:应该有效,对吗

但它实际上不是一个元组

逗号在Python中创建元组;括号只是为了消除歧义。值2+3不是单个元素5的元组,它只是数字5。如果想要一个包含该元素的元组,则需要2+3或2+3

这正是代码中发生的事情。没有逗号,您只需创建列表[self.obj.first\u name,self.obj.last\u name]。当你迭代它时,你不会得到一个2元素的列表,你会得到一个名字,大概是一个字符串,所以你实际上是在做first,last=first\u name,这是胡说八道。1

要解决此问题,只需添加逗号:

accounts = ([self.obj.first_name(), self.obj.last_name()],)

或者你可以只使用一个列表。你不是真的在寻找不变性,否则你会有一个元组的元组,而不是列表的元组,或者对于一个位置有意义的固定大小集合,或者对于一个微优化,元组应该减少约6%,请发布完整的异常,而不仅仅是描述,这样我们就可以验证它确实来自第一个,后进帐户:。但是假设它是那一行,你在它前面有一个printaccounts。它印的是什么?非常感谢。这确实是问题所在。事实上,我也曾想过在列表中添加逗号,在我查看之后,我现在看到我将逗号放在列表的方括号内,而不是列表外,因此我认为这不是问题所在。愚蠢的错误。谢谢@在Python中,列表与元组不同,是由括号组成的,因此[2+3]是一个单元素列表。因为你通常处理的是1,2,3对[1,2,3],直到你第一次遇到这个bug时你才注意到区别,每个人都会在某个时候遇到这个bug……还有一个问题。您建议我如何创建更多这些列表元素并将它们放入元组中?因为元组是不可变的,所以我不能循环遍历元组和追加。有没有办法把一个列表列表转换成一个列表元组?如果这个问题含糊不清,我很抱歉。我只是想ask@BallaBaby对,不能附加到元组。您可以编写accounts=accounts+account,,但这会为每个附加创建一个全新的副本,如果事情变得越来越大,这可能是个坏主意。如果这对你有什么意义的话,它需要二次而不是摊销线性时间。因此,正如您所建议的,创建一个列表,然后在末尾转换为一个tuple,accounts=tupleaccounts,通常是最好的答案。除非…你知道怎么写生成器吗?创建一个生成帐户的生成器,然后做accounts=tuplelazy_accounts.@ballaby但同时,有什么原因需要是一个元组而不是一个列表?这看起来确实像是列表的范例用例。
accounts = [[self.obj.first_name(), self.obj.last_name()]]