2016-06-26 32 views
3

排序大约470000个元组时出现错误。 我读csv文件数据到元组ValueError:太多值来解包太多的元组

fp = open(filename, 'Ur') 
for line in fp: 
    listOfCitiesTuples.append(tuple(line.strip().split(','))) 
fp.close() 

元组的列表中有许多相关的一些城市的名字。

[('Chiredzi', '4117'), ('Gaths', '4117'), ('Masvingo', '4117'), ('Chivhu', '4120'), ('Gweru', '4120'), ('Kwekwe', '4120'), ('Mvuma', '4120'), ('Redcliffe', '4120'), ('Shurugwi', '4120'), ('Zvishavane', '4120')] 

我收集在一个列表关联在一起,以相同数量的所有名称并将其映射到该号码,构成所有这些项目的字典,像这样

{'1': ['Bombuflat', 'Garacharma', 'Port Blair', 'Rangat'], '113': ['Hydra', 'Kouba'], '294': ['Vienna', 'Wien'], '1327': ['Lambarene', 'Ndjole']} 

使用下面的方法来实现它

for k, v in listOfCitiesTuples: dictOfCitiesTuples.setdefault(v, []).append(k) 

这对(我已经测试20000到目前为止)数量较少元组的工作得很好,但似乎并没有工作在更大的数字,如47万

可能大量的元组是一个问题或可能是由于损坏的文件?如果这是由于文件中某些损坏的数据造成的,那么我能做些什么来找出损坏的数据是什么样的,例外吗?

我得到这个错误

File "/../view.py", line 186, in getCities 
    for k, v in listOfCitiesTuples: dictOfCitiesTuples.setdefault(v, []).append(k) 
ValueError: too many values to unpack (expected 2) 
+0

将此元组导入熊猫数据框并检查文件中是否有损坏的数据。 – min2bro

+0

什么是完整的错误?这更有可能你有1或3个值,你打开两个。也许一个城市的名字中有一个逗号,所以你得到3个值。 –

+0

@jas这不是完整的错误。哪行代码正在执行? –

回答

2

基于你的标题ValueError: too many values to unpack你有一些数据以不同的格式比您预期。

具体而言,某些行有多个逗号,这些逗号会构成一个具有多于2个值的元组,当您尝试解压缩它们时会导致错误。

在迭代文件时,可以检查元组的长度是否正确。如果你发现数据不好,你可以记下它并修复它,或者忽略它。取决于你的需求。

with open(filename, 'Ur') as infile: 
    for line_num, line in enumerate(infile): 
     vals = tuple(line.strip().split(',')) 
     if len(vals) == 2: 
      listOfCitiesTuples.append(vals) 
     else: 
      bad_data.append((line_num, line)) 
+0

问题是一行有两个逗号,即Putignano,1872年。感谢您找到该行的技巧 – jas

0

通过看你的代码,并采取了猜测,什么可能发生的是文件的最后一行可能是与什么也没有一个额外的行。所以line.strip().split(',')返回一个大小为1的列表,它成为一个大小为1的元组,它在你的for循环中爆炸。添加后保护:

fp = open(filename, 'Ur') 
for line in fp: 
    if len(line.strip()) > 0: 
    listOfCitiesTuples.append(tuple(line.strip().split(','))) 
fp.close() 
+0

你可以问一个问题,而不必猜测。 OP要澄清他们的问题。 –

+0

@ pgreen2问题是由于数据损坏。一行导致问题 – jas

相关问题