python 解压 xlsxwriter 的值太多

python too many values to unpack xlsxwriter

我很难找出问题所在。我了解该错误并正在按照此处 https://xlsxwriter.readthedocs.io/tutorial01.html 的教程进行操作以写入 excel 工作簿,但我仍然不断收到错误 for first, last in accounts: ValueError: too many values to unpack (expected 2) 如果有人可以提供帮助,那就太好了。我已经尝试删除名字和姓氏的方法以及 create_accounts() 方法的帐户元组中的方法并替换为字符串,但这也没有帮助。

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()

这是 class,其中包含我的帐户对象方法 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()])

乍一看,这看起来像一个列表元组,元组中唯一的列表有两个值。所以,for first, last in accounts: 应该可以,对吧?

但它实际上不是一个元组。

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

这正是您的代码中发生的事情。如果没有逗号,您只是在创建列表 [self.obj.first_name(), self.obj.last_name()]。当你迭代它时,你不会得到一个 2 元素列表,你会得到一个名称(大概是一个字符串),所以你实际上是在做 first, last = first_name,这是无意义的。1

要修复它,只需添加逗号:

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

或者您可以只使用列表。你并不是真的在这里寻找不变性(否则你会有元组的元组,而不是列表的元组),或者对于位置有意义的固定大小的集合,或者微优化(元组应该刮胡子~6% 的 <100 字节......),这些是使用元组代替列表的主要原因:

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

1.实际上,这是一个完全合法的陈述,因为字符串是可迭代的——它们迭代它们的单个字符。但是像 'Balla' 这样的名字有 5 个字符,而您正试图将这 5 个元素解压缩为 2 个变量。因此错误 ValueError: too many values to unpack (expected 2).