Python:解包的值太多(字典)

Posted

技术标签:

【中文标题】Python:解包的值太多(字典)【英文标题】:Python: Too many values to unpack (dictionary) 【发布时间】:2013-08-06 15:47:11 【问题描述】:

我正在尝试通过将文本文件中的两行和两行配对来将键值对添加到字典中。为什么这不起作用?

newdata = 
os.chdir("//GOLLUM//tbg2//tbg2//forritGB")
f = open(filename)
for line1, line2 in f.readlines():
    newdata[line1] = line2

编辑:我得到的错误是

ValueError: too many values to unpack

【问题讨论】:

【参考方案1】:

您正在读取所有行,并将第一行(一个序列)分配给两个变量。这仅在第一行包含 2 个字符时才有效。将文件用作迭代器:

newdata = 
os.chdir("//GOLLUM//tbg2//tbg2//forritGB")
with open(filename) as f:
    for line1 in f:
        newdata[line1.strip()] = next(f, '').strip()

这里next() 从文件中读取下一行。

替代方法是使用成对配方:

from itertools import izip_longest

def pairwise(iterable):
    return izip_longest(*([iter(iterable)] * 2), '')

newdata = 
os.chdir("//GOLLUM//tbg2//tbg2//forritGB")
with open(filename) as f:
    for line1, line2 in pairwise(f):
        newdata[line1.strip()] = line2.strip()

注意str.strip() 调用,以删除任何多余的空格(包括每行末尾的换行符)。

【讨论】:

【参考方案2】:
newdata = 
os.chdir("//GOLLUM//tbg2//tbg2//forritGB")
with open(filename) as f:
    for line1, line2 in zip(*[iter(f)]*2):
        newdata[line1] = line2

os.chdir("//GOLLUM//tbg2//tbg2//forritGB")
with open(filename) as f:
    newdata = dict(zip(*[iter(f)]*2))

【讨论】:

为什么要将整个文件读入内存? .readlines() 在这里是一个内存猪,只需 直接 使用 f 并使用缓冲区读取行。 没想到。谢谢!

以上是关于Python:解包的值太多(字典)的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:解包的值太多(Python 2.7)

OpenCV python:ValueError:解包的值太多

Python ValueError:解包的值太多,解决方案?

Python2.7:要解包的值太多 - 列数未知

调用 cv2.findContours 解包的值太多

ValueError:使用 Sage 绘图时“解包的值太多”