2014-01-21 48 views
3

我有一个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) 
+5

你能显示确切的代码行,在哪个错误被引发? – thefourtheye

+0

你做错了什么。 (对不起,但没有看到你做什么,我不能提供更好的答案。) – glglgl

+3

它实质上意味着当输入字符串中有多个空格时,您不处理个案。 – gravetii

回答

14

您试图解开到这两个变量拆分列表确切的代码。

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中,你可以做这样的事情会在firstsecond分别和列表的其余部分分配此

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

前两个值将被分配到rest ,在Python 3.x

+1

他可能也想要'url,count = line.split(None,1)'(它可以将任何多余的空间转储到'count'中),或者'url,_,count = line.partition('') '(同样也会这样做,但是也不会因'count'留空而处理空格)。或者他可能只是想抓住这个例外并重新提出一个更相关的例外,因为“一个bc d''应该算作一个错误,但希望有一个更可调试的错误。或者也许以上都不是;很难告诉我们必须继续...... – abarnert

+0

@abarnert谢谢:)我现在在回答中添加了'partition'方法并引发了'ValueError'。 – thefourtheye

+1

请注意,他目前认为这样的事情不会发生在他的文件中,所以我会建议使用一种方法,大声抱怨该行的行号和数据,而不是一个只是静静地吞下所有内容的方法。 – RemcoGerlich

相关问题