Próbuję użyć NetworkX do odczytania pliku Shapefile i użyć funkcji write_shp()
do wygenerowania plików Shapefile, które będą zawierać węzły i krawędzie, ale gdy próbuję uruchomić kod, pojawia się następujący błąd:
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'
Używam Python 3.4 i zainstalowałem NetworkX przez pip install.
Przed tym błędem dał mi już inny, który powiedział „xrange nie istnieje” lub coś w tym rodzaju, więc spojrzałem na to i po prostu zmieniłem xrange
na range
w pliku nx_shp.py, który wydawał się go rozwiązać.
Z tego, co przeczytałem, może to być związane z wersją Pythona (Python2 vs Python3).
python
python-3.x
dictionary
friveraa
źródło
źródło
dict.iteritems -> dict.items
.iteritems
naitems
. Ten pierwszy dał ci iterator (a 3.x nie ma takiej metody); ten ostatni daje widok (który został przeniesiony do wersji 2.7 asviewitems
).Odpowiedzi:
Gdy jesteś w Python3, użyj
dict.items()
zamiastdict.iteritems()
iteritems()
został usunięty w python3, więc nie możesz już używać tej metody.Spójrz na sekcję Zmiany wbudowane w Python 3.0 Wiki , gdzie jest powiedziane:
źródło
iteritems
funkcjifuture.utils
lubsix
modułów.W Python2 mieliśmy
.items()
i.iteritems()
słowniki.dict.items()
zwróciła listę krotek w słowniku[(k1,v1),(k2,v2),...]
. Skopiował wszystkie krotki ze słownika i utworzył nową listę. Jeśli słownik jest bardzo duży, ma to duży wpływ na pamięć.Więc stworzyli
dict.iteritems()
w późniejszych wersjach Python2. Zwrócił obiekt iteratora. Cały słownik nie został skopiowany, więc zużycie pamięci jest mniejsze. Ludzie używającyPython2
są uczeni używaniadict.iteritems()
zamiast.items()
wydajności, jak wyjaśniono w poniższym kodzie.Wynik:
W Python3 chcieli sprawić, by był bardziej wydajny, więc przenieśli się
dictionary.iteritems()
do niegodict.items()
i usunęli,.iteritems()
ponieważ nie był już potrzebny.Użyłeś
dict.iteritems()
wPython3
tak nie udało. Spróbuj użyćdict.items()
która ma taką samą funkcjonalność jakdict.iteritems()
zPython2
. Jest to niewielki problem z migracją odPython2
doPython3
.źródło
Miałem podobny problem (przy użyciu 3.5) i straciłem 1/2 dnia, ale oto coś, co działa - jestem na emeryturze i dopiero uczę się języka Python, aby pomóc w tym mojemu wnukowi (12).
źródło
W Python2
dictionary.iteritems()
jest bardziej wydajny niżdictionary.items()
w Python3, funkcjadictionary.iteritems()
została przeniesiona dodictionary.items()
iiteritems()
została usunięta. Otrzymujesz ten błąd.Użyj
dict.items()
w Python3, który jest taki sam jakdict.iteritems()
w Python2.źródło
Celem
.iteritems()
było wykorzystanie mniejszej ilości pamięci, dając jeden wynik na raz podczas zapętlania. Nie jestem pewien, dlaczego wersja Python 3 nie obsługuje,iteritems()
chociaż okazało się, że jest wydajniejsza niż.items()
Jeśli chcesz dołączyć kod, który obsługuje zarówno wersję PY 2, jak i 3,
Może to pomóc, jeśli wdrożysz projekt w innym systemie i nie masz pewności co do wersji PY.
źródło
Jak odpowiedział RafaelC, Python 3 zmienił nazwę na dict.iteritems -> dict.items. Wypróbuj inną wersję pakietu. Spowoduje to wyświetlenie listy dostępnych pakietów:
Następnie uruchom ponownie wersję, którą spróbujesz po ==, aby zainstalować / zmienić wersję
źródło