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 los bordes, pero cuando intento ejecutar el código me da el siguiente error:
Traceback (most recent call last): File
"C:/Users/Felipe/PycharmProjects/untitled/asdf.py", line 4, in
<module>
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 la instalación de pip.
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
al range
archivo nx_shp.py, que parecía resolverlo.
Por lo que he leído, podría estar relacionado con la versión de Python (Python2 vs Python3).
python
python-3.x
dictionary
friveraa
fuente
fuente
dict.iteritems -> dict.items
.iteritems
aitems
. El primero le dio un iterador (y 3.x no tiene tal método); este último le ofrece una vista (que se exportó a 2.7 comoviewitems
).Respuestas:
Como estás en python3, usa en
dict.items()
lugar dedict.iteritems()
iteritems()
se eliminó en python3, por lo que ya no puede usar este método.Eche un vistazo a la sección Python 3.0 Wiki Built-in Changes , donde se indica:
fuente
iteritems
función de los módulosfuture.utils
o en susix
lugar.En Python2 , teníamos
.items()
y.iteritems()
en diccionarios.dict.items()
lista devuelta 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.Entonces crearon
dict.iteritems()
en versiones posteriores de Python2. Esto devolvió el objeto iterador. No se copió todo el diccionario, por lo que el consumo de memoria es menor. A las personas que usan sePython2
les enseña a usar endict.iteritems()
lugar de.items()
por eficiencia, como se explica en el siguiente código.Salida:
En python3 , querían hacerlo más eficiente, por lo que se trasladó
dictionary.iteritems()
adict.items()
, y retirados.iteritems()
, ya que ya no era necesaria.Ha utilizado
dict.iteritems()
enPython3
lo que ha fallado. Trate de usardict.items()
que tiene la misma funcionalidad quedict.iteritems()
dePython2
. Este es un pequeño problema de migración dePython2
aPython3
.fuente
Tuve un problema similar (usando 3.5) y perdí 1/2 día, pero aquí hay algo que funciona: estoy retirado y solo estoy aprendiendo Python para poder ayudar a mi nieto (12) con él.
fuente
En Python2,
dictionary.iteritems()
es más eficiente quedictionary.items()
en Python3, la funcionalidad dedictionary.iteritems()
se ha migradodictionary.items()
yiteritems()
se ha eliminado. Entonces estás recibiendo este error.Úselo
dict.items()
en Python3, que es igual quedict.iteritems()
Python2.fuente
El propósito de
.iteritems()
era usar menos espacio de memoria produciendo un resultado a la vez durante el bucle. No estoy seguro de por qué la versión de Python 3 no es compatible,iteritems()
aunque ha demostrado ser más eficiente que.items()
Si desea incluir un código que sea compatible con PY versión 2 y 3,
Esto puede ayudar si implementa su proyecto en otro sistema y no está seguro de la versión PY.
fuente
Como respondió RafaelC, Python 3 renombró dict.iteritems -> dict.items. Pruebe con una versión de paquete diferente. Esto enumerará los paquetes disponibles:
Luego vuelva a ejecutar con la versión que intentará después de == para instalar / cambiar la versión
fuente