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)
.
我很难找出问题所在。我了解该错误并正在按照此处 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)
.