为什么当我尝试拆分一行输入并分配给多个变量时会收到 ValueError ?
- 2024-12-26 08:43:00
- admin 原创
- 118
问题描述:
我尝试了一些类似的代码来从文件中读取问题和答案对:
questions_list = []
answers_list = []
with open('qanda.txt', 'r') as questions_file:
for line in questions_file:
line = line.strip()
questions, answers = line.split(':')
questions_list.append(questions)
answers_list.append(answers)
但有时我会收到一条异常信息questions, answers = line.split(':')
,内容如下:
(Python 2.x)builtins.ValueError: need more than 1 value to unpack
(Python 3.x)ValueError: not enough values to unpack (expected 2, got 1)
或者相反的问题:ValueError: too many values to unpack (expected 2)
为什么会出现这种情况?我该如何修复或解决这个问题?
解决方案 1:
这可能是因为在进行拆分时没有:
,所以函数只返回一个参数,而不是 2。这可能是由最后一行引起的,这意味着最后一行只有空格。像这样:
>>> a = ' '
>>> a = a.strip()
>>> a
''
>>> a.split(':')
['']
如您所见,返回的列表.split
只是一个空字符串。因此,为了向您展示演示,这是一个示例文件:
a: b c: d e: f g: h
我们尝试使用以下脚本(val.txt
是上述文件的名称):
with open('val.txt', 'r') as v:
for line in v:
a, b = line.split(':')
print a, b
这给了我们:
Traceback (most recent call last):
a b
c d
File "C:/Nafiul Stuff/Python/testingZone/28_11_13/val.py", line 3, in <module>
a, b = line.split(':')
e f
ValueError: need more than 1 value to unpack
当尝试通过调试器查看此变量时,变量line
变为`
`,并且您无法拆分它。
然而,一个简单的逻辑修正就可以解决这个问题:
with open('val.txt', 'r') as v:
for line in v:
if ':' in line:
a, b = line.strip().split(':')
print a, b
解决方案 2:
尝试:
question, answers = line.split(':', maxsplit=1)
question, __, answers = line.partition(':')
此外,在 Python 3 中你还可以做其他事情:
question, *many_answers = line.split(':')
看起来像:
temp = line.split(':')
question = temp[0]
many_answers = tuple(temp[1:])
解决方案 3:
line.split(':')
显然返回一个包含一个元素而不是两个元素的列表。
因此,这就是为什么它不能将结果解包为questions
和answers
。例如:
>>> line = 'this-line-does-not-contain-a-colon'
>>> question, answers = line.split(':')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack
解决方案 4:
发生这种情况的原因可能有几个,其他答案中已经提到过。空行,或者一行只有一个问题而没有冒号。如果你想解析这些行,即使它们没有冒号(例如,如果某些行只有问题),你可以将拆分更改为以下内容:
questions, answers, garbage = (line+'::').split(':', maxsplit=2)
这样,如果questions
和 的值answers
存在,则会填充它们,如果原始文件没有它们,则会为空。无论出于何种目的,都忽略变量garbage
。