-1
def reademail():
f = open("Y11email.csv", "r")
line= "email"+ ","+"fname"+","+"sname"+"password"+"\n"
for line in f:
    email,fname,sname,password=line.split(", ")#splits each line however creates an extra space between the lines because of enter
    password=password.strip()#strip removes the extra space between the lines
    print(email,fname,sname,password)
f.close()

我是 python 新手,所以我不明白我不断收到的错误。我希望有人能解释一下。如果您需要更多信息,我会编辑它。

email,fname,sname,password=line.split(", ")#splits 每一行但是会在行之间创建一个额外的空格,因为 enter

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

我希望它像这样打印:

email@abc.org.uk 姓名 姓 fakepassword

check@email.org.uk ZY fakepassword

testing@the.program 雷检查你好

编辑:我试图删除逗号后的空格并尝试 .split("\n") 但得到

email,fname,sname,password=line.split("\n")#splits 每一行但是会在行之间创建一个额外的空格,因为 enter

ValueError:没有足够的值来解包(预期 4,得到 2)

至少我又多了一个价值XD

4

2 回答 2

0

与其重新实现 csv 阅读器,不如使用 Python 标准库中的csv 模块

从文档中复制的示例:

>>> import csv
>>> with open('eggs.csv', newline='') as csvfile:
...     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
...     for row in spamreader:
...         print(', '.join(row))
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam

这显示了读取 CSV 文件的规范方法。请注意,csv.reader每次迭代都会产生一个字符串列表,因此您不必拆分它。

您可以在拆分之前测试行的长度:

for row in Y11reader:
    ll = len(row)
    if ll != 4:
        logging.warning('invalid row of {} items'.format(ll))
        continue  # skip to next iteration.
    email, fname, sname, password = row
于 2017-10-15T08:30:18.413 回答
0

问题是你的输入。您需要确保输入中的每一行都具有所有这 4 个特征,并且它们始终由逗号分隔。

当方程右侧的值数量与右侧的变量数量不匹配时,会发生此错误。一个例子是:

以下工作作为该行被分成4个元素的列表

line = "1,2,3,4"
line_list = line.split(',') #Looks like [1,2,3,4]
first, second, third, fourth = line.split(',') #Each element is assigned to each variable

但以下不起作用

line = "1,2,3"
line_list = line.split(',') #Looks like [1,2,3]
first, second, third, fourth = line.split(',') 

没有元素到变量的一对一映射。因此,解释器会抛出一个错误说not enough values to unpack (expected 4, got 3). 由于列表中预期有 4 个值(因为等式左侧有 4 个变量,但只提供了 3 个。

于 2017-10-15T08:30:57.167 回答