[英]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.