【问题标题】:not enough values to unpack (expected 3, got 1)没有足够的值来解包(预期 3,得到 1)
【发布时间】:2022-01-05 17:37:45
【问题描述】:

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

 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)

【问题讨论】:

  • 文件长什么样?错误是告诉您该行中只有一个字段。
  • 姓名;电子邮件;等级 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=';')。 csv 文件的默认分隔符是逗号,而不是分号。

标签: python python-3.x csv ssl smtplib


【解决方案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']

【讨论】:

    猜你喜欢
    • 2018-08-14
    • 2019-02-08
    • 1970-01-01
    • 2022-08-13
    • 2016-04-10
    • 2016-07-05
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多