Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在将文本文件转换为字典时避免ValueError_Python_File_Dictionary - Fatal编程技术网

Python 如何在将文本文件转换为字典时避免ValueError

Python 如何在将文本文件转换为字典时避免ValueError,python,file,dictionary,Python,File,Dictionary,这是我的“studList.txt” 这是我的密码。为什么要显示结果 ABC|JOINED DEF|ABSENT GHI|ABSENT JKL|JOINED MNO|JOINED PQR|ABSENT STU|JOINED VWX|JOINED YZA|JOINED ABC|JOINED DEF|ABSENT GHI|JOINED JKL|JOINED MNO|JOINED PQR|ABSENT STU|ABSENT VWX|ABSENT YZA|JOINED ABC|JOINED DEF|JO

这是我的“studList.txt”

这是我的密码。为什么要显示结果

ABC|JOINED
DEF|ABSENT
GHI|ABSENT
JKL|JOINED
MNO|JOINED
PQR|ABSENT
STU|JOINED
VWX|JOINED
YZA|JOINED
ABC|JOINED
DEF|ABSENT
GHI|JOINED
JKL|JOINED
MNO|JOINED
PQR|ABSENT
STU|ABSENT
VWX|ABSENT
YZA|JOINED
ABC|JOINED
DEF|JOINED
GHI|JOINED
JKL|JOINED
MNO|JOINED
PQR|ABSENT
STU|JOINED
VWX|ABSENT
YZA|JOINED
ValueError:没有足够的值来解包(预期值为2,实际值为1)


正如评论所暗示的,您的数据可能在某个地方存在问题,而当前问题中的代码确实有效。显然,理想的解决方案是通过修复生成数据的流程来消除此问题,但是,例如,如果数据是手动生成的,则更好的方法是验证数据,而不仅仅是假设数据是正确的。例如:

d={}
with open("studList.txt") as f:
    for line in f:
        (name,status)=line.strip().split("|")
        d[name]=status
print(d)
d = {}
with open(r"../../Downloads/studList.txt") as f:
    for line in f:
        data = line.strip().split("|")
        if len(data) == 2:
            d[data[0]] = data[1]
print(d)
通过迎合可能不正确的数据,您可以防止获得该值错误

或者,如果发现错误数据确实是一种例外情况,并且您希望将其忽略并记录,则另一种方法是将有问题的代码包装为
try
/
,但
块除外,例如:

d={}
with open("studList.txt") as f:
    for line in f:
        (name,status)=line.strip().split("|")
        d[name]=status
print(d)
d = {}
with open(r"../../Downloads/studList.txt") as f:
    for line in f:
        data = line.strip().split("|")
        if len(data) == 2:
            d[data[0]] = data[1]
print(d)
两者都将跳过任何错误记录


如注释中所述,您正在为同一个键分配多个值,因此只有最后一个键将继续存在。希望这是正确的行为,或者只是这个虚拟数据的情况。如果您的类可能有两个同名的人,则需要不同的标识符。最后要注意的是,
(名称、状态)
中的括号是多余的。

您是否打印了
以查看问题行是什么?我猜这是一个空行
addif not line.strip():在拆分之前继续。有一行不包含
|
,因此
split
不会返回两部分。检查文件中是否有空行。似乎有多行文本具有相同的键值,因此将替换dict中现有的键值对。也许没关系,只是检查一下。