ValueError: too many values to unpack with too many tuples

Refresh

December 2018

Views

811 time

3

I get an error while sorting about 470000 tuples. I read data from csv file into list of tuples

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

Tuples are some cities names associated with a number.

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

I collect all the names associated to same number together in a list and map it to that number and form a dict of all those items, something like this

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

Using following method to achieve it

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

This works fine for a smaller number of tuples( I have tested 20,000 so far), but doesn't seem to be working on larger number like 470000.

Could large number of tuples be a problem or could it be due to corrupted file? If it is due to some corrupted data in a file, is there something I can do to find out what corrupted data it is like try, exception ?

I get this error

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)
jas

2 answers

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

Глядя на ваш код и принимая догадку, что может происходить последняя строка файла может быть дополнительная строка с чем в нем. Таким образом , line.strip().split(',')возвращает список размера 1, который становится кортежем размера , 1который дует в вашей для петли. Добавьте следующий охранник:

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