ValueError: too many values to unpack (while using a dict with tuple keys)
ValueError: too many values to unpack (while using a dict with tuple keys)
我想比较两个 .txt 文件。第一个文件是 "key",三个值由制表符分隔(即 "Item Number" "Response" 和 "Code")。第二个文件包含两个由制表符分隔的值("Item Number" 和 "Response")。我需要我的程序搜索第一个文件,找到任何与第二个文件匹配的 "Item Number/Response" 对,然后输出正确的 "Code." 如果没有匹配,那么我希望输出只是一个space (" ")。我不是程序员,但弄清楚这一点会大大减少我在工作中花在某些任务上的时间。
我发现这个 对设置我的代码很有帮助。我想完成同样的事情。
file 1, "Key.txt":
1 dog C
2 cat C
3 bird C
4 pig C
5 horse C
1 cat Sem
2 bat TA
3 animal Super
4 panda M
5 pencil U
file2, "Uncoded.txt":
4 pig
3 animal
5 bird
2 bat
2 cat
0
1 fluffy
0 dog
1
desired output:
4 pig C
3 animal Super
5 bird
2 bat TA
2 cat C
0
1 fluffy
0 dog
1
下面是我的代码:
f1 = open("Key.txt")
f2 = open("Uncoded.txt")
d = {}
while True:
line = f1.readline()
if not line:
break
c0,c1,c2 = line.split('\t')
d[(c0,c1)] = (c0,c1,c2)
while True:
line = f2.readline()
if not line:
break
c0,c1 = line.split('\t')
if (c0,c1) in d:
vals = d[(c0,c1)]
print (c0, c1, vals[1])
f1.close()
f2.close()
如果我尝试用制表符 ('\t') 分隔各行,则会出现 ValueError: too many values to unpack at the line "c0,c1,c2 = line.split('\t')"
非常感谢您的任何见解或帮助!
您遇到的问题是您的一个文件中的一行没有您期望的项目数。一个可能的原因是额外的换行符(可能在文件末尾)。 Python 会将其视为在最后 real 行之后只有一个换行符的行。如果不能将空行分成三部分,您的逻辑就会失败。
解决此问题的一种方法是拆分为单个变量,而不对值进行解包。然后你可以查看拆分了多少件,如果是预期的数量才继续拆包:
while True:
line = f1.readline()
if not line:
break
vals = line.split('\t') # don't unpack immediately
if len(val) == 3: # check you got the expected number of items
c0, c1, c2 = vals # unpack only if it will work
d[(c0,c1)] = (c0,c1,c2)
else:
print("got unexpected number of values: {}".format(vals) # if not, report the error
这与您的错误无关,但如果您愿意,可以通过使用 for
循环而不是 while
循环来大大简化循环。文件对象是可迭代的,产生文件的行(就像你从 readline()
中得到的一样)。最好的事情是你不需要自己寻找文件的结尾,迭代只是在文件已用完:
for line in f1: # this does the same thing as the first four lines in the code above
...
我想比较两个 .txt 文件。第一个文件是 "key",三个值由制表符分隔(即 "Item Number" "Response" 和 "Code")。第二个文件包含两个由制表符分隔的值("Item Number" 和 "Response")。我需要我的程序搜索第一个文件,找到任何与第二个文件匹配的 "Item Number/Response" 对,然后输出正确的 "Code." 如果没有匹配,那么我希望输出只是一个space (" ")。我不是程序员,但弄清楚这一点会大大减少我在工作中花在某些任务上的时间。
我发现这个
file 1, "Key.txt":
1 dog C
2 cat C
3 bird C
4 pig C
5 horse C
1 cat Sem
2 bat TA
3 animal Super
4 panda M
5 pencil U
file2, "Uncoded.txt":
4 pig
3 animal
5 bird
2 bat
2 cat
0
1 fluffy
0 dog
1
desired output:
4 pig C
3 animal Super
5 bird
2 bat TA
2 cat C
0
1 fluffy
0 dog
1
下面是我的代码:
f1 = open("Key.txt")
f2 = open("Uncoded.txt")
d = {}
while True:
line = f1.readline()
if not line:
break
c0,c1,c2 = line.split('\t')
d[(c0,c1)] = (c0,c1,c2)
while True:
line = f2.readline()
if not line:
break
c0,c1 = line.split('\t')
if (c0,c1) in d:
vals = d[(c0,c1)]
print (c0, c1, vals[1])
f1.close()
f2.close()
如果我尝试用制表符 ('\t') 分隔各行,则会出现 ValueError: too many values to unpack at the line "c0,c1,c2 = line.split('\t')"
非常感谢您的任何见解或帮助!
您遇到的问题是您的一个文件中的一行没有您期望的项目数。一个可能的原因是额外的换行符(可能在文件末尾)。 Python 会将其视为在最后 real 行之后只有一个换行符的行。如果不能将空行分成三部分,您的逻辑就会失败。
解决此问题的一种方法是拆分为单个变量,而不对值进行解包。然后你可以查看拆分了多少件,如果是预期的数量才继续拆包:
while True:
line = f1.readline()
if not line:
break
vals = line.split('\t') # don't unpack immediately
if len(val) == 3: # check you got the expected number of items
c0, c1, c2 = vals # unpack only if it will work
d[(c0,c1)] = (c0,c1,c2)
else:
print("got unexpected number of values: {}".format(vals) # if not, report the error
这与您的错误无关,但如果您愿意,可以通过使用 for
循环而不是 while
循环来大大简化循环。文件对象是可迭代的,产生文件的行(就像你从 readline()
中得到的一样)。最好的事情是你不需要自己寻找文件的结尾,迭代只是在文件已用完:
for line in f1: # this does the same thing as the first four lines in the code above
...