为什么当我尝试拆分一行输入并分配给多个变量时会收到 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: ...

问题描述:

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

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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   8  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   9  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用