Python 分割函数。解包错误的值太多

新手上路,请多包涵

我有一个 python 函数,它必须从文件中读取数据并将其拆分为两个键和值,然后将其存储在字典中。示例:文件:

 http://google.com 2
http://python.org 3
# and so on a lot of data

我为此使用了拆分功能,但是当确实有很多数据时它会引发值错误

ValueError: too many values to unpack

我该怎么办?

这是失败的确切代码

with open(urls_file_path, "r") as f:
    for line in f.readlines():
        url, count = line.split()# fails here
        url_dict[url] = int(count)

原文由 user3156971 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 492
2 个回答

您正在尝试将拆分列表解包到这两个变量中。

 url, count = line.split()

如果没有空格或两个或更多空格怎么办?剩下的话会去哪里呢?

 data = "abcd"
print data.split()    # ['abcd']
data = "ab cd"
print data.split()    # ['ab', 'cd']
data = "a b c d"
print data.split()    # ['a', 'b', 'c', 'd']

您实际上可以在分配之前检查长度

with open(urls_file_path, "r") as f:
    for idx, line in enumerate(f, 1):
        split_list = line.split()
        if len(split_list) != 2:
            raise ValueError("Line {}: '{}' has {} spaces, expected 1"
                .format(idx, line.rstrip(), len(split_list) - 1))
        else:
            url, count = split_list
            print url, count

使用输入文件,

 http://google.com 2
http://python.org 3
http://python.org 4 Welcome
http://python.org 5

这个程序产生,

 $ python Test.py
Read Data: http://google.com 2
Read Data: http://python.org 3
Traceback (most recent call last):
  File "Test.py", line 6, in <module>
    .format(idx, line.rstrip(), len(split_list) - 1))
ValueError: Line 3: 'http://python.org 4 Welcome' has 2 spaces, expected 1

按照 @abarnert 的评论,您可以像这样使用 partition 函数

url, _, count = data.partition(" ")

如果有多个空格/没有空格,则 count 将分别保留字符串的其余部分或空字符串。

如果你使用的是 Python 3.x, 你可以这样做

first, second, *rest = data.split()

前两个值将分别分配给 firstsecond ,列表的其余部分将分配给 rest

原文由 thefourtheye 发布,翻译遵循 CC BY-SA 3.0 许可协议

熊猫数据帧的 str.split 方法也可以返回“太多值无法解包”错误。

例如,在“ , ”模式上拆分字符向量:

 import pandas
df = pandas.DataFrame({"x": ["a", "a, b", "a,b,c"]})
df.x.str.split(",")

# 0          [a]
# 1      [a,  b]
# 2    [a, b, c]

df.x.str.split(",", n=1)

# 0         [a]
# 1     [a,  b]
# 2    [a, b,c]

df.x.str.split(",", expand=True)

#    0     1     2
# 0  a  None  None
# 1  a     b  None
# 2  a     b     c

df.x.str.split(",", n=1, expand=True)

#    0     1
# 0  a  None
# 1  a     b
# 2  a   b,c

以下版本仅在每行恰好有 2 个拆分时才有效。在此示例中,它失败并显示错误“要解压的值太多(预期为 2)”

 df["y"], df["z"] = df.x.str.split(",", n=1)

具有 n=1expand=True 的最后一个版本是用于多向量分配的版本。它等同于 R 中的 tidyr::separate

 df[["y", "z"]] = df.x.str.split(",", n=1, expand=True)
df

#        x  y     z
# 0      a  a  None
# 1   a, b  a     b
# 2  a,b,c  a   b,c

根据 pandas.Series.str.split 的文档 If n > 0 and

“如果对于某一行,找到的拆分数 < n,如果 expand=True,则附加 None 以填充到 n。”

原文由 Paul Rougieux 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题