Función de división de Python. Demasiados valores para descomprimir error

Tengo una función de python que debe leer los datos del archivo y dividirlos en dos claves y valores, y luego almacenarlos en el diccionario. Ejemplo: archivo:

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

Utilizo la función de división para ello, pero cuando realmente hay muchos datos, genera un error de valor.

 ValueError: too many values to unpack 

Qué puedo hacer sobre esto ?

Este es el código exacto que falla

 with open(urls_file_path, "r") as f: for line in f.readlines(): url, count = line.split()# fails here url_dict[url] = int(count) 

Está intentando desenvolver la lista dividida en estas dos variables.

 url, count = line.split() 

¿Qué pasa si no hay espacio o dos o más espacios? ¿A dónde irán las demás palabras?

 data = "abcd" print data.split() # ['abcd'] data = "ab cd" print data.split() # ['ab', 'cd'] data = "abcd" print data.split() # ['a', 'b', 'c', 'd'] 

Puedes verificar la longitud antes de asignar

 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 

Con el archivo de entrada,

 http://google.com 2 http://python.org 3 http://python.org 4 Welcome http://python.org 5 

Este progtwig produce,

 $ 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  .format(idx, line.rstrip(), len(split_list) - 1)) ValueError: Line 3: 'http://python.org 4 Welcome' has 2 spaces, expected 1 

Siguiendo el comentario de @abarnert , puedes usar la función de partition como esta

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

Si hay más de un espacio / sin espacio, la count contendrá el rest de la cadena o la cadena vacía, respectivamente.

Si está utilizando Python 3.x, puede hacer algo como esto

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

Los primeros dos valores se asignarán en first y second respectivamente, y el rest de la lista se asignará al rest , en Python 3.x