繁体   English   中英

没有足够的值来解包(预期 3,得到 1)

[英]not enough values to unpack (expected 3, got 1)

我遇到了以下问题,我不知道如何解决它。 请帮忙,如果您也能解释一下您是如何做到的,那就太好了。

 import csv, smtplib, ssl
 
 message = """Subject: Your grade
 
 Hi {name}, your grade is {grade}"""
 from_address = "michael@gmail.com"
 password = input("Type your password and press enter: ")
 
 context = ssl.create_default_context()
 with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
     server.login(from_address, password)
     with open("contacts_file.csv") as file:
         reader = csv.reader(file)
         next(reader)  # Skip header row
         for name, email, grade in reader:
             server.sendmail(
                 from_address,
                 email,
                 message.format(name=name,grade=grade),
             )

错误


ValueError                                Traceback (most recent call last)
/var/folders/q8/qn3d11d90fbbz0j6kllhpn9h0000gn/T/ipykernel_34629/2824055323.py in <module>
     13         reader = csv.reader(file)
     14         next(reader)  # Skip header row
---> 15         for name, email, grade in reader:
     16             server.sendmail(
     17                 from_address,

ValueError: not enough values to unpack (expected 3, got 1)

您的主要问题是您的文件是用分号分隔的,并且 CSV 阅读器希望文件用逗号分隔。

这是你现在拥有的:

with open('contacts_file.csv') as file:
    reader = csv.reader(file)
    next(reader)  # Skip header row
    for row in reader:
        print(row)

看起来像这样:

['michael;y@gmail.com;2']
['zas;s@gmail.com;32']
['dasdas;btnike888@vireonidae.com;32']
['dasdas;ym2000@gmail.com;312']

您的行是一个字符串的列表,这会导致您的“解包错误”:您希望每一行(列表)包含三个项目,但现在只有一个项目:整行。

指定分隔符:

reader = csv.reader(file, delimiter=';')

你会得到:

['michael', 'y@gmail.com', '2']
['zas', 's@gmail.com', '32']
['dasdas', 'btnike888@vireonidae.com', '32']
['dasdas', 'ym2000@gmail.com', '312']

现在您可以解压缩每一行:

for row in reader:
    name, email, grade = row
    ...

我建议阅读row整个事情,然后拆包row 更容易检查正确性和调试:

for row in reader:
    assert len(row) == 3, f'Expected 3 columns but only have {len(row)}: {row}'
    name, email, grade = row

对于您的原始设置,您会收到一个有用的错误,例如:

AssertionError: Expected 3 columns but only have 1: ['michael;y@gmail.com;2']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM