J'essaie d'utiliser NetworkX pour lire un fichier de forme et la fonction write_shp()
pour générer les fichiers de forme qui contiendront les nœuds et les arêtes, mais lorsque j'essaie d'exécuter le code, l'erreur suivante s'affiche:
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'
J'utilise Python 3.4 et j'ai installé NetworkX via pip install.
Avant cette erreur, il m'en avait déjà donné une autre qui disait "xrange n'existe pas" ou quelque chose du genre, alors je l'ai vérifiée et j'ai juste changé xrange
en range
dans le fichier nx_shp.py, qui semblait le résoudre.
D'après ce que j'ai lu, cela pourrait être lié à la version Python (Python2 vs Python3).
Comme vous êtes dans python3, utilisez dict.items()
au lieu de dict.iteritems()
iteritems()
a été supprimé de python3, vous ne pouvez donc plus utiliser cette méthode.
Jetez un coup d'œil à la section Python 3.0 Wiki Modifications intégrées , où il est indiqué:
Suppression de
dict.iteritems()
,dict.iterkeys()
etdict.itervalues()
.Au lieu de cela: utilisez
dict.items()
,dict.keys()
etdict.values()
respectivement.
Dans Python2, nous avions .items()
et .iteritems()
dans les dictionnaires. dict.items()
a retourné la liste des n-uplets du dictionnaire [(k1,v1),(k2,v2),...]
. Il a copié tous les tuples du dictionnaire et créé une nouvelle liste. Si le dictionnaire est très volumineux, l'impact sur la mémoire est très important.
Ils ont donc créé dict.iteritems()
dans les versions ultérieures de Python2. Cet objet itérateur est retourné. Le dictionnaire entier n’a pas été copié, ce qui réduit la consommation de mémoire. Les personnes utilisant Python2
apprennent à utiliser dict.iteritems()
au lieu de .items()
pour plus d'efficacité, comme expliqué dans le code suivant.
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
Sortie:
Time with d.items(): 9.04773592949
Time with d.iteritems(): 2.17707300186
Dans Python, ils voulaient le rendre plus efficace. dictionary.iteritems()
a donc été déplacé vers dict.items()
et supprimé .iteritems()
, car il n'était plus nécessaire.
Vous avez utilisé dict.iteritems()
dans Python3
et l'échec a donc eu lieu. Essayez d’utiliser dict.items()
, qui a les mêmes fonctionnalités que dict.iteritems()
sur Python2
. Il s'agit d'un petit problème de migration de Python2
à Python3
.
J'ai eu un problème similaire (avec 3,5) et j'ai perdu une demi-journée, mais voici quelque chose qui fonctionne: je suis à la retraite et je viens d'apprendre Python pour pouvoir aider mon petit-fils (12) à le faire .
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()
est plus efficace que dictionary.items()
. En Python3, la fonctionnalité de dictionary.iteritems()
a été migrée vers dictionary.items()
et iteritems()
est supprimée. Donc, vous obtenez cette erreur.
Utilisez dict.items()
dans Python3, qui est identique à dict.iteritems()
de Python2.
Comme l'a répondu RafaelC, Python 3 a été renommé dict.iteritems -> dict.items. Essayez une autre version du paquet. Ceci listera les paquets disponibles:
python -m pip install yourOwnPackageHere==
Puis relancez avec la version que vous allez essayer après == d'installer/changer de version
Le but de .iteritems()
était d’utiliser moins d’espace mémoire en générant un résultat à la fois tout en boucle. Je ne suis pas sûr de savoir pourquoi la version Python 3 ne prend pas en charge la fonction iteritems()
alors que son efficacité s'est avérée supérieure à celle de .items()
Si vous souhaitez inclure un code prenant en charge à la fois les versions 2 et 3 de PY,
try:
iteritems
except NameError:
iteritems = items
Cela peut aider si vous déployez votre projet dans un autre système et que vous n'êtes pas sûr de la version PY.