Python слишком много значений, чтобы распаковать xlsxwriter - PullRequest
0 голосов
/ 03 июля 2018

Мне трудно выяснить, в чем проблема может быть здесь. Я понимаю ошибку и следую указаниям здесь, https://xlsxwriter.readthedocs.io/tutorial01.html,, для записи в книгу Excel, но я все еще получаю сообщение об ошибке for first, last in accounts: ValueError: too many values to unpack (expected 2) Если кто-то может помочь, это было бы здорово. Я попытался удалить методы для имени и фамилии, а также в кортеже account для метода 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()

Вот класс, который содержит мои методы first_name и last_name для объекта account.

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)

1 Ответ

0 голосов
/ 03 июля 2018

Проблема здесь:

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()]. Когда вы повторяете это, вы не получаете двухэлементный список, вы получаете имя (предположительно строку), поэтому вы фактически делаете first, last = first_name, что является бессмысленным. 1

Чтобы это исправить, просто добавьте запятую:

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

Или вы можете просто использовать список. Вы на самом деле не ищете здесь неизменности (в противном случае у вас будет кортеж кортежей, а не кортежей списков), или для коллекции фиксированного размера, где позиция имеет смысл, или для микрооптимизации (кортеж должен бриться ~ 6% из <100 байт…), и это основные причины использования кортежей вместо списков: </p>

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

1. На самом деле, это совершенно законное утверждение, потому что строки повторяемы - они повторяют свои отдельные символы. Но имя, такое как, скажем, 'Balla' имеет 5 символов, и вы пытаетесь распаковать эти 5 элементов в 2 переменные. Отсюда ошибка ValueError: too many values to unpack (expected 2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...