Error: “objeto ‘dict’ no tiene atributo ‘iteritems'”

Estoy tratando de usar NetworkX para leer un Shapefile y usar la función write_shp() para generar los Shapefiles que contendrán los nodos y bordes (siguiendo este ejemplo <- este enlace ahora está muerto ), pero cuando bash ejecutar el Código que me da el siguiente error:

 Traceback (most recent call last): File "C:/Users/Felipe/PycharmProjects/untitled/asdf.py", line 4, in  nx.write_shp(redVial, "shapefiles") File "C:\Python34\lib\site-packages\networkx\readwrite\nx_shp.py", line 192, in write_shp for key, data in e[2].iteritems(): AttributeError: 'dict' object has no attribute 'iteritems' 

Estoy usando Python 3.4 e instalé NetworkX a través de pip install.

Antes de este error, ya me había dado otro que decía “xrange no existe” o algo así, así que lo busqué y simplemente cambié xrange a range en el archivo nx_shp.py, que pareció resolverlo.

Por lo que he leído, podría estar relacionado con la versión de Python (Python2 vs Python3).

Como estás en python3, usa dict.items() lugar de dict.iteritems()

iteritems() se eliminó en python3, por lo que ya no puede usar este método.

Eche un vistazo a la sección Cambios incorporados en la wiki de Python 3.0, donde se indica:

Se eliminaron dict.iteritems() , dict.iterkeys() y dict.itervalues() .

En su lugar: use dict.items() , dict.keys() y dict.values() respectivamente.

En Python2 , teníamos .items() y .iteritems() en los diccionarios. dict.items() devolvió la lista de tuplas en el diccionario [(k1,v1),(k2,v2),...] . Copió todas las tuplas en el diccionario y creó una nueva lista. Si el diccionario es muy grande, hay un gran impacto en la memoria.

Así que crearon dict.iteritems() en versiones posteriores de Python2. Este objeto iterador devuelto. No se copió el diccionario completo, por lo que hay un menor consumo de memoria. A las personas que usan Python2 les enseña a usar dict.iteritems() lugar de .items() por eficiencia, como se explica en el siguiente código.

 import timeit d = {i:i*2 for i in xrange(10000000)} start = timeit.default_timer() for key,value in d.items(): tmp = key + value #do something like print t1 = timeit.default_timer() - start start = timeit.default_timer() for key,value in d.iteritems(): tmp = key + value t2 = timeit.default_timer() - start 

Salida:

 Time with d.items(): 9.04773592949 Time with d.iteritems(): 2.17707300186 

En Python3 , querían hacerlo más eficiente, por lo que trasladó dictionary.iteritems() a dict.items() , y eliminó .iteritems() porque ya no era necesario.

Ha utilizado dict.iteritems() en Python3 por lo que ha fallado. Intente usar dict.items() que tiene la misma funcionalidad que dict.iteritems() de Python2 . Este es un pequeño problema de migración de bits desde Python2 a Python3 .

Tuve un problema similar (usando 3.5) y perdí 1/2 día, pero aquí hay algo que funciona: estoy jubilado y solo estoy aprendiendo Python para poder ayudar a mi nieto (12) con él.

 mydict2={'Atlanta':78,'Macon':85,'Savannah':72} maxval=(max(mydict2.values())) print(maxval) mykey=[key for key,value in mydict2.items()if value==maxval][0] print(mykey) YEILDS; 85 Macon 

En Python2, dictionary.iteritems() es más eficiente que dictionary.items() por lo que en Python3, la funcionalidad de dictionary.iteritems() se migró a dictionary.items() y se eliminaron los iteritems() . Así que estás recibiendo este error.

Use dict.items() en Python3 que es igual que dict.iteritems() de Python2.

El propósito de .iteritems() era usar menos espacio en la memoria produciendo un resultado a la vez mientras realizaba un bucle. No estoy seguro de por qué la versión de Python 3 no admite iteritems() aunque se ha demostrado que es eficiente que .items()

Si desea incluir un código que admita tanto la versión PY 3 como la 3,

 try: iteritems except NameError: iteritems = items 

Esto puede ayudar si implementa su proyecto en algún otro sistema y no está seguro acerca de la versión PY.

Como respondió RafaelC, Python 3 cambió su nombre a dict.iteritems -> dict.items. Pruebe una versión diferente del paquete. Esto listará los paquetes disponibles:

 python -m pip install yourOwnPackageHere== 

Luego vuelva a ejecutar con la versión que intentará después de == instalar / cambiar versión