Python拆分功能。解压错误的值太多

时间:2014-01-21 09:54:07

标签: python string

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

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

我使用split函数,但是当有很多数据时会引发值错误

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)

2 个答案:

答案 0 :(得分:17)

您正尝试将拆分列表展开到这两个变量中。

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's comment,您可以使用partition这样的功能

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

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

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

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

前两个值将分别在firstsecond中分配,列表的其余部分将分配到rest,在Python 3.x中

答案 1 :(得分:0)

当拆分表达式左侧的标识符数量小于行中的分隔符(此处为空格)的数量时,将出现太多解包错误,因此您必须保留左侧的确切标识符数量分隔符分割后的表达式赋值