Ich versuche, mit NetworkX ein Shapefile zu lesen und mit der Funktion write_shp()
die Shapefiles zu generieren, die die Knoten und Kanten enthalten. Wenn ich jedoch versuche, den Code auszuführen, wird der folgende Fehler angezeigt:
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'
Ich verwende Python 3.4 und installiere NetworkX über die Pip-Installation.
Vor diesem Fehler war es schon mir gegeben ein anderes, auf den „xrange existiert nicht“ oder so ähnlich, so dass ich es nachgeschlagen und nur geändert , xrange
um range
in der nx_shp.py - Datei, die es zu lösen schien.
Nach dem, was ich gelesen habe, könnte es mit der Python-Version (Python2 vs Python3) zusammenhängen.
python
python-3.x
dictionary
friveraa
quelle
quelle
dict.iteritems -> dict.items
.iteritems
zuitems
. Ersteres gab Ihnen einen Iterator (und 3.x hat keine solche Methode); Letzteres gibt Ihnen eine Ansicht (die auf 2.7 als zurückportiert wurdeviewitems
).Antworten:
Verwenden Sie
dict.items()
anstelle von Python3 anstelle vondict.iteritems()
iteritems()
wurde in python3 entfernt, daher können Sie diese Methode nicht mehr verwenden.Schauen Sie sich den Abschnitt Integrierte Änderungen im Python 3.0-Wiki an, in dem Folgendes angegeben ist:
quelle
iteritems
Funktion der Modulefuture.utils
oder zusix
verwenden.In Python2 hatten wir
.items()
und.iteritems()
in Wörterbüchern.dict.items()
Liste der Tupel im Wörterbuch zurückgegeben[(k1,v1),(k2,v2),...]
. Es wurden alle Tupel im Wörterbuch kopiert und eine neue Liste erstellt. Wenn das Wörterbuch sehr groß ist, hat dies sehr große Auswirkungen auf den Speicher.Also haben sie
dict.iteritems()
in späteren Versionen von Python2 erstellt. Dieses zurückgegebene Iteratorobjekt. Das gesamte Wörterbuch wurde nicht kopiert, sodass weniger Speicherplatz benötigt wird. Den BenutzernPython2
wird beigebracht,dict.iteritems()
anstelle der.items()
Effizienz zu verwenden, wie im folgenden Code erläutert.Ausgabe:
In Python3 , wollten sie es effizienter, so bewegt , um
dictionary.iteritems()
zudict.items()
und entfernt ,.iteritems()
da sie nicht mehr gebraucht wurde.Sie haben verwendet
dict.iteritems()
inPython3
so dass es versagt hat. Versuchen Sie es mit ,dict.items()
die die gleiche Funktionalität wiedict.iteritems()
derPython2
. Dies ist ein kleines Problem bei der Migration vonPython2
nachPython3
.quelle
Ich hatte ein ähnliches Problem (mit 3.5) und verlor 1/2 pro Tag, aber hier ist etwas, das funktioniert - ich bin im Ruhestand und lerne gerade Python, damit ich meinem Enkel (12) dabei helfen kann.
quelle
In Python2,
dictionary.iteritems()
effizienter als istdictionary.items()
so in Python3, der die Funktionalitätdictionary.iteritems()
wurde migriertdictionary.items()
unditeritems()
wird entfernt. Sie erhalten also diesen Fehler.Verwendung
dict.items()
in Python3, dasdict.iteritems()
mit Python2 identisch ist.quelle
Der Zweck von
.iteritems()
bestand darin, weniger Speicherplatz zu verbrauchen, indem beim Schleifen jeweils ein Ergebnis erzielt wurde. Ich bin nicht sicher, warum Python 3-Version nicht unterstützt,iteritems()
obwohl es sich als effizient erwiesen hat als.items()
Wenn Sie einen Code einfügen möchten, der sowohl PY Version 2 als auch PY 3 unterstützt,
Dies kann hilfreich sein, wenn Sie Ihr Projekt auf einem anderen System bereitstellen und sich über die PY-Version nicht sicher sind.
quelle
Wie von RafaelC beantwortet, wurde Python 3 in dict.iteritems -> dict.items umbenannt. Versuchen Sie es mit einer anderen Paketversion. Dadurch werden die verfügbaren Pakete aufgelistet:
Führen Sie dann die Version erneut aus, die Sie nach == versuchen werden, um die Version zu installieren / zu wechseln
quelle