【问题标题】:ValueError when using split() with multiple delimiters使用带有多个分隔符的 split() 时出现 ValueError
【发布时间】:2021-03-20 20:59:45
【问题描述】:

问题:
我想知道如何在 python 中使用 split() 来处理带有两个或多个分隔符的文本。运行代码时出现错误。下面提供了代码、错误和示例数据。

代码:

from mrjob.job import MRJob
from mrjob.step import MRStep


class LeagueCount(MRJob):
    def steps(self):
        return [
            MRStep(
                mapper=self.mapper_get_league,
                reducer=self.reducer_count_league
            )
        ]

    def mapper_get_conference(self, _, line):
        (Players, Team,League, year) = line.split('|')
        yield League, 1

    def reducer_count_league(self, key, values):
        yield key, sum(values)


if __name__ == '__main__':
    LeagueCount.run()

观察到的错误:
ValueError:要解压的值太多(预计 4 个)

示例数据:
player1, player2, player3|切尔西|英超|2014
player1, player2, player3|阿森纳|预备役|2018
player1, player2, player3|马刺队|预备队|2015
player1, player2, player3|切尔西|Premership|2016

【问题讨论】:

  • 您需要编辑帖子以执行以下操作:1) 为代码提供适当的缩进。 2) 为我们提供该行包含的内容的示例,以便我们了解为什么会引发此错误(例如为什么它返回超过 4 个元素)。 3) 向我们提供您想要达到的目标的明确预期输出。如果您提供这些详细信息,我们可以更好地帮助您。截至目前,这个问题尚未明确。
  • @the23Effect 感谢您的回复,代码中添加了示例数据。
  • 感谢您提供详细信息。我编辑的帖子中有一些格式错误。
  • @the23Effect 我已经更新了帖子,当我使用上面的代码时,只有一个球员可以工作,我能够获得每个独特的联赛及其数量。但是,通过使用逗号分隔添加更多玩家,它会弹出此错误。请告诉我你的想法,谢谢

标签: python mapreduce delimiter valueerror


【解决方案1】:

更新 1:(更改数据和代码后):

在您设置的代码中,mapper=self.mapper_get_league, 但函数名为mapper_get_conference()。我更改了它并使用完全相同的数据运行代码,它可以在我的系统中运行。下面是我得到的输出。

部分输出:

Running step 1 of 1...  
"Premership"    3  
"Premiership"   1  

注意:

  • 确保数据文件末尾没有空行,否则会抛出 ValueError: not enough values to unpack(expected 4, got 1)。这是因为 mapper 将尝试读取一个没有字符的空行,因此它将包含 None 并尝试将其分配给 4 个变量。
  • 确保数据中的每个条目(行)都在新行中,因为输入行一直到新行。如果您没有换行符并且两行数据在一行中,则 split() 将产生比预期更多的值并抛出 ValueError: too many values to unpack(expected 4)

所以我猜问题出在数据上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-08
    • 2013-11-26
    • 1970-01-01
    • 2014-07-24
    • 2011-08-25
    • 1970-01-01
    • 2016-07-25
    相关资源
    最近更新 更多