【问题标题】:Why do I inconsistently get a ValueError or IndexError when splitting a string and using the results?为什么在拆分字符串和使用结果时会不一致地得到 ValueError 或 IndexError?
【发布时间】:2022-08-11 13:44:07
【问题描述】:

我有一些代码通过拆分来处理一些输入文本:

text = get_data_from_internet() # or read it from a file, whatever
a, b, c = text.split(\'|\')

通常,这可以正常工作,但偶尔我会收到一条错误消息,看起来像

ValueError: not enough values to unpack (expected 3, got 1)

如果我尝试从拆分中获得单个结果,如下所示:

first = text.split()[0]

然后类似地它有时似乎工作,但其他时候我得到

IndexError: list index out of range

到底是怎么回事?我认为它与数据有关,但我怎样才能理解问题并解决它?


此问题旨在作为常见调试问题的规范。它旨在主要解释错误消息的含义,特别是输入字符串导致问题的原因。像这样的问题是通常不会由错字引起的;需要解释的人会问他们。

    标签: python string split valueerror index-error


    【解决方案1】:

    问题是.split 的结果中没有足够的项目。 .split 将根据输入生成一个字符串列表;该列表的长度取决于输入字符串,而不是在任何周围的代码上。

    当你写a, b, c = text.split('|')时,.split方法不知道期望三个值;它根据|s 的数量给出适当数量的结果,然后发生错误。在这种情况下,错误是ValueError,因为有问题价值:列表没有足够的项目。

    当你写first = text.split()[0]时,可能有问题指数(该代码中的[0]),导致IndexError。原因是一样的:列表没有足够的项目。 (对于空列表,即使[0] 也不能用作索引。)另请参见:Does "IndexError: list index out of range" when trying to access the N'th item mean that my list has less than N items?

    特别注意:当使用分隔符调用.split 时(如第一个示例),结果列表中将至少包含一个项目。有时候是这样的即使输入是空字符串

    >>> ''.split(',')
    ['']
    

    然而,这是不是使用.split时的情况没有分隔符(在任何空格序列上拆分的特殊情况行为):

    >>> ''.split()
    []
    

    解决问题:

    1. 确保您使用正确的工具来完成这项工作。例如,如果您的输入是.csv 文件,则不应尝试自己编写代码将数据拆分为单元格。相反,使用csv 标准库模块。
    2. 仔细检查输入以找出问题所在。像这样的代码通常在一个循环中,一次处理一行文本;检查数据中出现的哪些行会导致问题。例如,您可以通过using exception handling and logging 执行此操作。有关调试问题的更多一般建议,请参阅https://ericlippert.com/2014/03/05/how-to-debug-small-programs/
    3. 决定出现错误输入时应采取的措施。通常,在输入中跳过一个空行是合适的。有时您可以为缺少的内容填写虚拟值。有时您应该报告自己的异常等。您可以考虑代码的特定上下文并决定正确的操作过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      相关资源
      最近更新 更多