为什么当我尝试拆分一行输入并分配给多个变量时会收到 ValueError ?

2024-12-26 08:43:00
admin
原创
117
摘要:问题描述:我尝试了一些类似的代码来从文件中读取问题和答案对:questions_list = [] answers_list = [] with open('qanda.txt', 'r') as questions_file: for line in questions_file: ...

问题描述:

我尝试了一些类似的代码来从文件中读取问题和答案对:

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(':')显然返回一个包含一个元素而不是两个元素的列表。

因此,这就是为什么它不能将结果解包为questionsanswers。例如:

>>> 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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用