Estou tentando usar o NetworkX para ler um Shapefile e usar a função write_shp()
para gerar os Shapefiles que conterão os nós e as bordas, mas quando tento executar o código, ele me dá o seguinte erro:
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'
Estou usando o Python 3.4 e instalei o NetworkX via instalação do pip.
Antes desse erro, ele já havia me dado outro que dizia "xrange não existe" ou algo assim, então procurei e mudei xrange
para range
no arquivo nx_shp.py, que parecia resolvê-lo.
Pelo que li, pode estar relacionado à versão do Python (Python2 vs Python3).
python
python-3.x
dictionary
friveraa
fonte
fonte
dict.iteritems -> dict.items
.iteritems
paraitems
. O primeiro forneceu um iterador (e o 3.x não possui esse método); o último fornece uma visão (que foi suportada para 2,7 asviewitems
).Respostas:
Como você está no python3, use em
dict.items()
vez dedict.iteritems()
iteritems()
foi removido no python3, então você não pode mais usar esse método.Dê uma olhada na seção Python 3.0 Wiki Built Changes , onde está declarado:
fonte
iteritems
função dosfuture.utils
ousix
módulos.No Python2 , tínhamos
.items()
e.iteritems()
nos dicionários.dict.items()
lista retornada de tuplas no dicionário[(k1,v1),(k2,v2),...]
. Ele copiou todas as tuplas no dicionário e criou uma nova lista. Se o dicionário for muito grande, haverá um grande impacto na memória.Então eles criaram
dict.iteritems()
em versões posteriores do Python2. Este objeto retornado do iterador. O dicionário inteiro não foi copiado, portanto, há menor consumo de memória. As pessoas que usamPython2
são ensinadas a usar emdict.iteritems()
vez de.items()
obter eficiência, conforme explicado no código a seguir.Resultado:
No Python3 , eles queriam torná-lo mais eficiente, movido
dictionary.iteritems()
paradict.items()
e removido,.iteritems()
pois não era mais necessário.Você usou
dict.iteritems()
emPython3
por isso falhou. Tente usardict.items()
qual possui a mesma funcionalidadedict.iteritems()
dePython2
. Este é um pequeno problema de migração dePython2
paraPython3
.fonte
Eu tive um problema semelhante (usando 3.5) e perdi 1/2 por dia, mas aqui está uma coisa que funciona - sou aposentado e estou apenas aprendendo Python para poder ajudar meu neto (12) com ele.
fonte
No Python2,
dictionary.iteritems()
é mais eficiente quedictionary.items()
no Python3, a funcionalidade dedictionary.iteritems()
foi migradadictionary.items()
eiteritems()
removida. Então você está recebendo este erro.Use
dict.items()
no Python3, que é o mesmodict.iteritems()
do Python2.fonte
O objetivo
.iteritems()
era usar menos espaço de memória, produzindo um resultado de cada vez durante o loop. Não sei por que a versão Python 3 não suporta,iteritems()
embora tenha sido provada ser eficiente do que.items()
Se você deseja incluir um código que suporte as versões 2 e 3 do PY,
Isso pode ajudar se você implantar seu projeto em algum outro sistema e não tiver certeza da versão do PY.
fonte
Conforme respondido por RafaelC, o Python 3 renomeou dict.iteritems -> dict.items. Experimente uma versão diferente do pacote. Isso listará os pacotes disponíveis:
Em seguida, execute novamente a versão que você tentará depois == para instalar / alternar a versão
fonte