我有一个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)
答案 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()
前两个值将分别在first
和second
中分配,列表的其余部分将分配到rest
,在Python 3.x中
答案 1 :(得分:0)
当拆分表达式左侧的标识符数量小于行中的分隔符(此处为空格)的数量时,将出现太多解包错误,因此您必须保留左侧的确切标识符数量分隔符分割后的表达式赋值